log4j
本文主要内容包含:实现log4j升级至log4j2,并实现日志自动删除的操作步骤以及注意事项。
一、升级原因:
log4j存在天然缺陷:
通过调研,log4j2采用异步输出,并且能通过配置实现自动删除日志。
二、现有日志方式
1.commons-logging
介绍: commons-logging是Apache内的日志接口,是通过LogFactory获取log对象,只是一个接口,具体实现依赖相关jar包。
升级方式:此种方式只需要将LogFactory的实现包改为log4j2即可(通过移除log4j包,引入log4j2包实现)。
2.slf4j(强烈推荐使用此种方式实现)
介绍: slf4j与1类似,是一个日志实现接口,具体实现依赖相关jar包。通过LoggerFactory获取log对象。可以使用{}占位符来代替字符串拼接。
升级方式:此种方式只需要将LoggerFactory的实现包改为log4j2即可(通过移除log4j包,引入log4j2包实现)。
3.Logger对象
介绍:直接使用log4j提供的Logger对象。
升级方式:
不更改代码:引入桥接包log4j-1.2-api。最好清除所有log4j包,若不能则需要保证将桥接包放在所有log4j包的前面,否则会被log4j包覆盖,不能实现桥接功能
更改代码:使用slf4j的LoggerFactory获取log对象。
三、日志升级
步骤
- 清理maven依赖,去除自己引入的log4j包。
- 引入桥接包log4j-1.2-api以及log4j2相关包于pom.xml文件的最前端。
<!-- log4j和log4j2的连接包 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.7</version>
</dependency>
<!-- log4j2相关包(scf依赖中以及引入,不过为了版本控制以及防止包冲突,建议在此引入) -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.7</version>
</dependency>
<!-- scf依赖升级 -->
<dependency>
<groupId>com.bj58.spat</groupId>
<artifactId>com.bj58.spat.scf</artifactId>
<version>4.2.21</version>
<type>pom</type>
</dependency>
3.更改配置文件。log4j.propertites–>>log4j2.xml文件(此处可实现定时删除,需要log4j2版本2.5以上)
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
<APPenders>
<console name="myConsole" target="SYSTEM_OUT">
<thresholdFilter level="info" onMatch="ACCEPT"/>
<Patternlayout pattern="[%d{MM-dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n"/>
</Console>
<RollingFile name="activexappender" fileName="../log/vip_scf_vipidentity/vip_vipidentity.log"
filePattern="../log/vip_scf_vipidentity/vip_vipidentity.log.%d{yyyy-MM-dd}.log">
<ThresholdFilter level="info" onMatch="ACCEPT"/>
<PatternLayout>
<Pattern>[%d{MM-dd HH:mm:ss SSS} %-5level] [%t] %c{3}.%M - %m%n%ex</Pattern>
</PatternLayout>
<Policies>
<!-- 每天滚存日志 -->
<TimebasedTriggeringPolicy modulate="true" Interval="1"/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="../log" maxdepth="1">
<IfFileName glob="vip_vipidentity*.log" />
<!-- 日志保存时间 -->
<IfLastModified age="5d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="myConsole"/>
<AppenderRef ref="activexAppender"/>
</Root>
</Loggers>
</Configuration>
TimeBasedTriggeringPolicy标签中的modulate表示生产日志,interval表示生产日志的时间,单位是日志格式filePattern的最后一位。如:此处的日志格式是 filePattern=”../log/vip_scf_vipidentity/vip_vipidentity.log.%d{yyyy-MM-dd}.log”,interval是1,则代表每天生成一份日志。
DefaultRolloverStrategy标签配置日志文件的生存时间,IfFileName使用正则表达式匹配需要删除的日志的格式,IfLastModified表示日志的有效期,单位有s、m、h、d,此处配合上文,表示保存5天的日志。
注意事项
- 若要实现日志自动删除功能,需要将jdk升级至jdk7以上(建议jdk8,未在jdk7上做全面测试)。这是因为log4j2的日志删除功能仅在2.5版本以上支持,而jdk6最高只能支持到2.3版本。
- log4j-1.2-api包至于最前端!!!
- 若启动时控制台出现如下日志,是因为去寻找log4j的配置文件未找到,则证明未成功升级到log4j2(桥接包未生效),需要检查maven依赖,是否桥接包之前有log4j包被引入(此处必须解决,否则可能导致某些jar包内的日志不能输出)。
log4j:WARN No appenders could be found for logger (com.bj58.testLog4j.TestLog4j).
log4j:WARN Please initialize the log4j system properly.
- 若启动时出现如下日志,是因为log4j2的版本过低,未引入delete标签,需要检查maven依赖。(此处只影响日志自动删除功能,若不需要可不用在意)
ERROR DefaultRolloverStrategy contains an invalid element or attribute "Delete"
- 建议统一使用slf4j的LoggerFactory获取log对象,方便以后日志维护。
private static Logger log = LoggerFactory.getLogger(RedisClientPool.class);
相关阅读
1.下载升级工具(MediaCreationTool.exe) 地址还是是微软官方地址:http://t.cn/RL9FHu0 2. 使用MediaCreationTool.exe升级系统 打
surface pro3/pro2/pro1 windows8.1 升级 win10 超级
前几天把手中的surface pro3从Windows10降到了8.1后来发现习惯了win0还是win10好所以又将win8.1的升回了10,其中发现从8.1不能直接
设置 - 通用 - 用量 - 管理存储空间 - 找到更新包(ios9.3),点击,删除 设置 - iTunes&App Stores, 找到Updates,关闭 如果以上两个方
app升级是一个看似简单其实很复杂的事情;网页可以随时更新,用户不需要做任何操作就可以升级到最新版本;但app每次版本发布都需要用户
我一直在思索,怎么才能让一家公司更快地成长?一个人怎么才能从一群人的竞争当中脱颖而出?1、人的四种认知状态最近,我看了一幅图,我在