log4j2是对log4j的一种颠覆式变化,添加多线程下的无锁写入,比logback速度还快。废弃了之前的properties方式,用xml或json来代替。
springboot集成需要先移除默认的logback依赖。
在spring-boot-start和spring-boot-start-test中添加以下内容,移除logback。
要不然会产生冲突或者死循环。
异常冲突:Class path contains multiple SLF4J bindings
异常死循环:stackoverflower org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
<exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions>
log4j-over-slf4j和slf4j-log4j12冲突,会引起死循环。
再添加:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> <version>2.1.1.RELEASE</version> </dependency>
因log4j2和logback现在统一使用SLF4j作为统一API因此如果lombok的话,则不用做任何修改。
springboot默认支持log4j的名字是 log4j2-spring.xml
spring的application.properties中添加以下内容。
logging.config=classpath:log4j2-spring.xml
spring.output.ansi.enabled=ALWAYS
同时创建log4j2-spring.xml文件,即可输出log4j内容。
<?xml version="1.0" encoding="UTF-8"?> <configuration status="OFF" packages="cn.com.testproject"> <appenders> <Console name="console"> <PatternLayout pattern="%highlight{[%p] %-d{yyyy-MM-dd HH:mm:ss,SSS} >>> %l%n[massage] %m%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=cyan, DEBUG=cyan,TRACE=blue}"/> </Console> <RollingFile type="RollingFile" name="file" fileName="${LOG_HOME}/app.log" filePattern="${LOG_HOME}/%d{yyyy}-app-%i.zip" append="false">
<PatternLayout pattern="[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %l >>> %m%n" />
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
<SizeBasedTriggeringPolicy size="1024 MB"/> <!-- <SizeBasedTriggeringPolicy size="1k"/> --> </Policies> <DefaultRolloverStrategy max="3"> <!-- <Delete basePath="exp/" maxDepth="1"> --> <!-- <IfFileName glob="*.zip" /> --> <!-- <IfLastModified age="7d" /> --> <!-- </Delete> --> </DefaultRolloverStrategy> </RollingFile> <!--(error单独输出)--> <RollingFile name="error-file" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/%d{yyyy}-error-%i.zip" append="false"> <PatternLayout pattern="[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %l >>> %m%n" /> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><!--(只接收error单独输出)--> <Policies> <TimeBasedTriggeringPolicy modulate="true" interval="1"/> <SizeBasedTriggeringPolicy size="1024 MB"/> </Policies> <DefaultRolloverStrategy max="1"> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="appinfo-file" fileName="${LOG_HOME}/appinfo/appinfo.log" filePattern="${LOG_HOME}/appinfo/$${date:yyyy-MM-dd}/appinfo-%d-%i.zip" append="false"> <PatternLayout pattern="%d [%t] %-5p > %m %n" /> <Policies> <!-- 每天换文件到日期目录 --> <TimeBasedTriggeringPolicy modulate="true" interval="1"/> <!-- 到文件大小后 移动到 filePattern指定目录 --> <SizeBasedTriggeringPolicy size="1024 MB"/> </Policies> <DefaultRolloverStrategy max="1"> <!-- <Delete basePath="exp/appinfo/" maxDepth="1"> --> <!-- <IfFileName glob="*.zip" /> --> <!-- <IfLastModified age="7d" /> --> <!-- </Delete> --> </DefaultRolloverStrategy> </RollingFile> </appenders> <loggers> <!--additivity="true" 若是additivity设为true,则子Logger不止会在自己的appender里输出,还会在root的logger的appender里输出 --> <logger name="error" level="info" additivity="true"> <appender-ref ref="console" /> <appender-ref ref="error-file" /> </logger> <logger name="appinfo" level="info" additivity="true"> <appender-ref ref="console" /> <appender-ref ref="appinfo-file" /> </logger> <logger name="org.springframework" level="info" additivity="false"> <appender-ref ref="console" /> <appender-ref ref="file" /> </logger> <logger name="org.springframework.jdbc.core" level="info" additivity="false"> <appender-ref ref="console" /> <appender-ref ref="file" /> </logger> <logger name="cn.com.testproject.core" level="debug" additivity="false"> <appender-ref ref="console" /> <appender-ref ref="file" /> </logger> <root level="debug"> <appender-ref ref="console" /> <appender-ref ref="file" /> <appender-ref ref="error-file" /><!--(只接收error单独输出)--> </root> </loggers> </configuration>
同时注意log_home的传入,从外界不能直接使用${log_home},而是将外界的值,传递给property。
<properties>
<property name="LOG_HOME">${sys:LOG_HOME}</property>
</properties>
在使用的地方使用即可。${LOG_HOME}
log4j2下彩色设置:
<Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%highlight{[%p] %-d{yyyy-MM-dd HH:mm:ss,SSS} >>> %l%n[massage] %m%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=cyan, DEBUG=cyan,TRACE=blue}"/> </Console>
<PatternLayout pattern="%highlight{[ %p ] [%-d{yyyy-MM-dd HH:mm:ss}] [ LOGID:%X{logid} ] [%l] %m%n}"/>
以上的形式%highlight{****}即可。
但是在log4j2.10后,在2.10版本以后,Log4j2默认关闭了Jansi(一个支持输出ANSI颜色的类库)。
IDEA: Run -》 Edit Configurations -》Environment,在VM options中添加 -Dlog4j.skipJansi=false
Eclipse :Run Configurations->Arguments-> VM arguments
-Dlog4j.skipJansi=false
参见:https://blog.csdn.net/zzc199055/article/details/86706695
注意:
RollingFile 如果发现某些配置不起作用,可将configuration变为 trace来获取具体信息,平时设置为 status="OFF";
file
<configuration status="trace"
删除无用文件可参考以下写法:
<DefaultRolloverStrategy max="5"> <Delete basePath="${LOG_HOME}" maxDepth="1"> <IfFileName glob="appManager-*.log.zip"> <IfAny> <IfAccumulatedFileCount exceeds="1"/> </IfAny> </IfFileName> <!-- <IfLastModified age="5d" />--> </Delete>
此处有篇文章讲的非常详细关于log4j2中的参数使用
http://www.bubuko.com/infodetail-2413996.html
log4j2的官方文档: http://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender
完整的項目配套:
<?xml version="1.0" encoding="UTF-8"?> <configuration status="OFF" packages="cn.com.yto56.coresystem"> <properties> <property name="LOG_HOME">/opt/tomcatinstance/tomcat10/scslog</property> </properties> <appenders> <RollingFile name="rollingfile" fileName="${LOG_HOME}/scs-api.log" filePattern="${LOG_HOME}/scsapi-%d{yyyy-MM-dd}-%i.log.zip" append="false"> <PatternLayout pattern="[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %l >>> %m%n" /> <CronTriggeringPolicy schedule="0 0 0 1/1 * ?"/> <Policies> <OnStartupTriggeringPolicy /> <SizeBasedTriggeringPolicy size="100 MB" /> <TimeBasedTriggeringPolicy inval="1"/> </Policies> <DefaultRolloverStrategy max="8"> <Delete basePath="${LOG_HOME}" maxDepth="2"> <IfFileName glob="scsapi*.zip" /> <IfLastModified age="6d" ></IfLastModified> </Delete> </DefaultRolloverStrategy> </RollingFile> <!--(error单独输出)--> <RollingFile name="error-file" fileName="${LOG_HOME}/error.log" filePattern="${LOG_HOME}/%d{yyyy}-error-%i.log.zip" append="false"> <PatternLayout pattern="[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %l >>> %m%n" /> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <Policies> <OnStartupTriggeringPolicy /> <SizeBasedTriggeringPolicy size="20 MB" /> <TimeBasedTriggeringPolicy /> </Policies> <DefaultRolloverStrategy max="6"> <Delete basePath="${LOG_HOME}" maxDepth="2"> <IfFileName glob="*error*.zip" /> <IfLastModified age="6d" ></IfLastModified> </Delete> </DefaultRolloverStrategy> </RollingFile> <loggers> <logger name="org.springframework" level="info" additivity="false"> <AppenderRef ref="rollingfile" /> <AppenderRef ref="error-file" /> </logger> <logger name="net.sf.json" level="info" additivity="false"> <AppenderRef ref="rollingfile" /> <AppenderRef ref="error-file" /> </logger> <logger name="com.ibm.gbs.ai.portal.framework" level="info" additivity="false"> <AppenderRef ref="rollingfile" /> <AppenderRef ref="error-file" /> </logger> <logger name="cn.com.yto56.basic.framework" level="info" additivity="false"> <AppenderRef ref="rollingfile" /> <AppenderRef ref="error-file" /> </logger> <Logger name="cn.com.yto56.coresystem" level="info" additivity="false"> <AppenderRef ref="rollingfile" /> <AppenderRef ref="error-file" /> </Logger> <Root level="info"> <AppenderRef ref="rollingfile" /> <AppenderRef ref="error-file" /><!--(只接收error单独输出)--> </Root> </loggers> </configuration>
※ 注意点说明:
Rolling-File - filePattern 的格式必须满足windows和linux能够支持的文件名格式,否则会不起效。比如:filePattern= "%d{HH:mm}-error-%i.log.zip" 因为冒号不被文件名支持,导致filePattern不起效。
- TimeBasedTriggeringPolicy的默认值是1,1的单位是根据filePattern最后使用的时间单位来定义。
比如:filePattern="test-%d{yyyy-MM-dd}.log.gz" 则1表示1天,filePattern="test-%d{yyyy-MM-dd-HH}.log.gz" 则1表示1小时。
- DefaultRolloverStrategy中的max是基于%i而言的,因此,如果filePattern中带有时间 filePattern="test-%d{yyyy-MM-dd}.log.gz",则对于日期翻滚就无法清理历史数据,仅能清理时间相同%i不同的数据,会让数据一直沉淀。
- IfLastModified 填入的值例如: 5D 3H 4M 6S ,没有月份。
- filePattern中一定要有日期,不然会报错,RollingFile不起作用
注意:delete功能要在2.5的版本以上才可以。
查看Logger信息,修改logger的level:
1. LoggerContext.getContext().getLoggers();
2. Configuration configuration = LoggerContext.getContext(false).getConfiguration();
LoggerContext.getContext(false).updateLoggers();