将LOG4J 升级到LOG4J2

升级原因

log4j存在天然缺陷:

log4j采用同步输出模式,当遇到高并发&日志输出过多情况,可能导致线程阻塞,消耗时间过大
log4j无法实现自动删除按照日期产生的日志,现有项目都采用定时脚本删除日志。
通过调研,log4j2采用异步输出,并且能通过配置实现自动删除日志。

升级步骤

修改POM.XML

<log4j2.version>2.11.2</log4j2.version
       
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-jcl</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
         
        <dependency
            <groupId>org.apache.logging.log4j</groupId
            <artifactId>log4j-1.2-api</artifactId
            <version>${log4j2.version}</version
        </dependency
         
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
 
 
<dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>

排除下面的jar包

<exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.activiti</groupId>
                    <artifactId>activiti-bpmn-model</artifactId>
                </exclusion>
            </exclusions>

 

 

在启动项目时抛出错误:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/E:/work/redxun/jsaas/src/main/webapp/WEB-INF/lib/activemq-all-5.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/E:/work/redxun/jsaas/src/main/webapp/WEB-INF/lib/log4j-slf4j-impl-2.11.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]

这种情况需要删除 activemq-all 中的slf4j 包。

 

在 resources 目录创建 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 设置log4j2的自身log级别为warn -->
<!-- OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<configuration status="error" monitorInterval="30">
    <properties>
        <property name="LOG_HOME">d:/logs</property>
        <property name="PATTERN_LAYOUT">[RX2]-%p-[%-d{yyyy-MM-dd HH:mm:ss}] [%t] %c{10}.%M(%L) | %m%n</property>
    </properties>
 
    <appenders>
        <console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
        </console>
         
        <RollingFile name="RollingFileDebug" fileName="${LOG_HOME}/debug.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->       
            <ThresholdFilter level="DEBUG"  onMatch="ACCEPT" />
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
  
        <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->       
            <ThresholdFilter level="WARN"  onMatch="ACCEPT" />
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
  
        <RollingFile name="RollingFileWarn" fileName="${LOG_HOME}/warn.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="WARN" onMatch="ACCEPT" />
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
  
        <RollingFile name="RollingFileError" fileName="${LOG_HOME}/error.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="${PATTERN_LAYOUT}"/>
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" />
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
  
    </appenders>
  
    <loggers>
        <!--
        <logger name="org.mybatis" level="INFO"></logger>
         -->
        <logger name="org.apache.activemq" level="INFO" >
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileError"/>
        </logger>
        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileDebug"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>
  
</configuration>

在代码中使用log4j2

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
 
Logger log = LogManager.getLogger("haha");
log.debug("debugger test");
log.warn("warn test");
log.error("err test");
log.info("info test");
posted @ 2020-06-03 12:12  DarJeely  阅读(670)  评论(0)    收藏  举报