将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"); |

浙公网安备 33010602011771号