springboot + log4j2

log4j2是对log4j的一种颠覆式变化,添加多线程下的无锁写入,比logback速度还快。废弃了以前的properties方式,用xml或json来代替。html

springboot集成须要先移除默认的logback依赖。spring

在spring-boot-start和spring-boot-start-test中添加如下内容,移除logbackapache

 <exclusions>
                <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>

再添加:json

<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

springboot默认支持log4j的名字是  log4j2-spring.xml多线程

spring的application.properties中添加如下内容。app

logging.config=classpath:log4j2-spring.xml
spring.output.ansi.enabled=ALWAYS

同时建立log4j2-spring.xml文件,便可输出log4j内容。spring-boot

<?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。spa

<properties>
<property name="LOG_HOME">${sys:LOG_HOME}</property>
</properties>

在使用的地方使用便可。${LOG_HOME}.net

 

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 必定要加 type=“RollingFile”,由于name咱们可能会随意起,而不是使用RollingFile,所以用type来声明。

 若是发现某些配置不起做用,可将configuration变为 trace来获取具体信息,平时设置为 status="OFF"

<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

相关文章
相关标签/搜索