log4j升级至log4j2

本文主要内容包含:实现log4j升级至log4j2,并实现日志自动删除的操作步骤以及注意事项。

一、升级原因:

log4j存在天然缺陷:

  1. log4j采用同步输出模式,当遇到高并发&日志输出过多情况,可能导致线程阻塞,消耗时间过大
  2. 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对象。

三、日志升级

步骤

  1. 清理maven依赖,去除自己引入的log4j包。
  2. 引入桥接包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);
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值