必威体育Betway必威体育官网
当前位置:首页 > IT技术

log4j升级至log4j2

时间:2019-07-09 17:44:35来源:IT技术作者:seo实验室小编阅读:55次「手机版」
 

log4j

本文主要内容包含:实现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);

相关阅读

18年怎么将win7升级到win10教程

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不能直接

iphone关闭系统升级提示

设置 - 通用 - 用量 - 管理存储空间 - 找到更新包(ios9.3),点击,删除 设置 - iTunes&App Stores, 找到Updates,关闭 如果以上两个方

安卓app升级的3种方式及交互细节

app升级是一个看似简单其实很复杂的事情;网页可以随时更新,用户不需要做任何操作就可以升级到最新版本;但app每次版本发布都需要用户

傅盛认知三部曲之一:所谓成长就是认知升级

我一直在思索,怎么才能让一家公司更快地成长?一个人怎么才能从一群人的竞争当中脱颖而出?1、人的四种认知状态最近,我看了一幅图,我在

分享到:

栏目导航

推荐阅读

热门阅读