简介
log4j2是log4j 1.x 的升级版,2015年5月,Apache宣布log4j1.x 停止更新。最新版为1.2.17。
log4j2参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:
1、异常处理:在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制。
2、性能提升:log4j2相较于log4j 1和logback都具有很明显的性能提升。
3、自动重载配置:参考了logback的设计,提供自动刷新参数配置,可以动态的修改日志的级别而不需要重启应用。
4、无垃圾机制,log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvm gc。
添加log4j2相关jar包
<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>
调用log4j2功能代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static Logger logger= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
配置说明
加载配置文件流程如下:
Log4j将检查“Log4j的配置文件“系统属性,如果设置,将尝试加载配置使用 ConfigurationFactory 匹配的文件扩展。
如果没有系统属性设置JSON ConfigurationFactory log4j2-test将寻找。 json或 log4j2-test。json在类路径中。
如果没有这样的文件发现XML ConfigurationFactory log4j2-test将寻找。 xml在 类路径。
如果一个测试文件无法找到JSON ConfigurationFactory log4j2将寻找。 log4j2.jsn json或 在类路径中。
如果一个JSON文件无法找到XML ConfigurationFactory将试图定位 log4j2。 xml在类路径中。
如果没有配置文件可以找到了 DefaultConfiguration 将被使用。 这将导致日志输出到控制台
本文以log4j2.yaml
为案例
Log4j2如果要解析yaml文件要添加如下依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
1、XML配置
<!-- status用来指定log4j2本身的打印日志的级别.
monitorinterval Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="WARN" monitorinterval=“30”>
<Appenders>
<!--Console标签是设置控制台输出的,属性name是设置其名字,target是设置其输出模式-->
<Console name="console" target="system_out">
<!--PatternLayout标签是设置控制台输出格式-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %l - %msg%n" />
<!--ThresholdFilter标签是设置其输出级别过滤,
属性onMatch值是accept表示接收info级别以上的,
属性onMismatch值是deny表示不接收info级别以下的,
-->
<ThresholdFilter level="debug" onMatch="accept" onMismatch="deny" />
</Console>
<!--File标签是设置输出文件,属性name是设置其名字,fileName是设置文件路径,append表示是否追加输出,true追加,false不追加-->
<File name="Log" fileName="logs/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} %L %M - %msg%n" />
</File>
<!--RollingFile标签是设置回滚文件,属性name是设置其名字,fileName是设置文件路径,filePattern表示回滚文件文件名格式-->
<RollingFile name="RollingFileInfo" fileName="logs/info.log" filePattern="logs/info-%d{yyyy-MM-dd}.log">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %class{36} - %l - %msg%n" />
<!-- Policies :日志滚动策略-->
<Policies>
<!-- 时间滚动策略,默认0点小时产生新的文件,
interval="6" : 自定义文件滚动时间间隔,每隔6小时产生新文件,
modulate="true" : 产生文件是否以0点偏移时间,即6点,12点,18点,0点-->
<TimeBasedTriggeringPolicy interval="6" modulate="true"/>
<!--文件大小滚动策略-->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<Loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<!--Logger节点用来单独指定日志的形式,name为包路径,比如要为org.springframework包下所有日志指定为INFO级别等。 -->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
<Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFileInfo" />
</Root>
<!--AsyncLogger :异步日志,LOG4J有三种日志模式,全异步日志,混合模式,同步日志,性能从高到底,线程越多效率越高,也可以避免日志卡死线程情况发生-->
<!--additivity="false" : additivity设置事件是否在root logger输出,为了避免重复输出,可以在Logger 标签下设置additivity为”false”-->
<AsyncLogger name="AsyncLogger" level="trace" includeLocation="true" additivity="false">
<appender-ref ref="RollingFileError"/>
</AsyncLogger>
</Loggers>
</Configuration>