log4j 使用介绍

log4j官方地址:http://logging.apache.org/log4j/2.x/manual/configuration.html

日志级别

从低到高

级别说明
trace追踪,是最低的日志级别,相当于追踪程序的执行,一般不怎么使用
debug一般在开发中,都将其设置为最低的日志级别,一般程序调试时使用,日志打印的详细些,方便调试
info输出感兴趣的信息,方便了解程序执行的过程,通过日志排查问题时比较有用
warn警告.有些时候,虽然程序不会报错,但是还是需要通知负责人关注
error错误,程序出错,可以是预料中的或者是预料之外的错误,都需要密切关注
fatal极其重大的错误。一般使用不到,最高级别的也就是error

配置示例


<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" strict="true" name="XMLConfigTest"
packages="org.apache.logging.log4j.test" monitorInterval="600">
<Properties>
<Property name="filename">target/test.log</Property>
</Properties>
<Filter type="ThresholdFilter" level="trace"/>

<Appenders>
<Appender type="Console" name="STDOUT">
<Layout type="PatternLayout" pattern="%m MDC%X%n"/>
<Filters>
<Filter type="MarkerFilter" marker="FLOW" onMatch="DENY" onMismatch="NEUTRAL"/>
<Filter type="MarkerFilter" marker="EXCEPTION" onMatch="DENY" onMismatch="ACCEPT"/>
</Filters>
</Appender>
<Appender type="Console" name="FLOW">
<Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n"/><!-- class and line number -->
<Filters>
<Filter type="MarkerFilter" marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<Filter type="MarkerFilter" marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</Appender>
<Appender type="File" name="File" fileName="${filename}">
<Layout type="PatternLayout">
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</Layout>
</Appender>
</Appenders>

<Loggers>
<Logger name="org.apache.logging.log4j.test1" level="debug" additivity="false">
<Filter type="ThreadContextMapFilter">
<KeyValuePair key="test" value="123"/>
</Filter>
<AppenderRef ref="STDOUT"/>
</Logger>

<Logger name="org.apache.logging.log4j.test2" level="debug" additivity="false">
<AppenderRef ref="File"/>
</Logger>

<Root level="trace">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>

</Configuration>

Configuration

log4j2.xml配置文件的根标签

比较常用的是:status

参数说明取值
status这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出OFF:不输出trace、debug、info、warn、error、fatal
strict设置日志配置是否为简洁模式还是精确模式。不支持JSON的配置方式。
name设置日志配置的名称
packages
monitorIntervalLog4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。

Properties

标签定义了在配置文件上下文可能会用到的键值对的信息

参数

Filters

filters的配置可以在全局、在loggers中、在appenders中。

filters也分为很多类型,此处单讲ThresholdFilter

ThresholdFilter

参数含义

参数含义取值
level过滤器匹配处理的日志级别info、warn、error等如果打印日志的level与配置的一样或者比配置的级别更高,那么就返回onMatch的结果;如果level比配置的要低,那么久返回onMismatch的结果。举例:如果level=warn,有一条日志,级别是error,error比warn级别高,那么属于onMatch,执行onMatch的操作。另一条日志,级别是info,info比warn级别低,那么属于onMismatch,执行onMismatch的操作。总结一下:日志级别>=配置的level,才是onMatch,否则是onMismatch
onMatch级别匹配时的处理名称说明ACCEPT将这一条日志写入当前appender,并且不执行后面的过滤器DENY这一条日志不写入当前的appenderNEUTRAL不确定是否写入当前appender,继续执行后面的过滤器
onMismatch级别不匹配时的处理

这里以项目中遇到的问题为例,介绍appenders中的配置

原先的配置如下👇。这样的配置,info.log中会记录info、warn、error等info以上的所有日志,warn.log中会记录warn、error等warn以上的日志,error.log中只会记录error及以上的日志。

<XMDFile name="INFO-LOG" fileName="info.log">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t [%p] %c{1} (%F:%L) %msg%n" />
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</XMDFile>
<!--可选配置:ERROR日志、WARN日志单独输出到一个文件-->
<XMDFile name="ERROR-LOG" fileName="error.log">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t [%p] %c{1} (%F:%L) %msg%n" />
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</XMDFile>
<XMDFile name="WARN-LOG" fileName="warn.log">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t [%p] %c{1} (%F:%L) %msg%n" />
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</XMDFile>

如果想将info、warn、error级别的日志单独存放到不同的文件中,需要配置成下面👇这样

info.log中多添加一个level=warn的ThresholdFilter,并配置onMatch=DENY,这样大于warn级别的日志都被DENY了,小于warn级别的日志执行onMismatch,继续执行level=info的ThresholdFilter

warn.log中的leve=error的ThresholdFilter的onMatch改为DENY,error级别日志就不在warn.log中打印。

<XMDFile name="INFO-LOG" fileName="info.log">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t [%p] %c{1} (%F:%L) %msg%n" />
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</XMDFile>
<!--可选配置:ERROR日志、WARN日志单独输出到一个文件-->
<XMDFile name="ERROR-LOG" fileName="error.log">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t [%p] %c{1} (%F:%L) %msg%n" />
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</XMDFile>
<XMDFile name="WARN-LOG" fileName="warn.log">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} %t [%p] %c{1} (%F:%L) %msg%n" />
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</XMDFile>

Appenders

appender设置日志输出的位置,appender中的filter标签可以设置输出级别

Loggers

logger的继承关系

父loggercom.test.Testcom.testroot使用LoggerFactory.getLogger(getClass())获取logger以包前缀为name配置的logger所有logger的父logger

loggers标签则是定义了一些必要的logger,logger代表用于输出日志信息的具体对象.logger内部有appender,指定这些对象输出的具体位置.可以定义多个appender。

标签涉及到了继承,最顶级的父标签是 ,如果在获取logger时在 下没有找到指定的logger,那就会使用父logger。

如果将logger中的参数additivity设置为false,表示这个logger输出的内容,不会在父logger中输出。另外,如果一个logger的name是另一个logger的name的前缀,那这个logger是另一个logger的父logger。

我们在程序中经常这样使用logger

Logger logger = LoggerFactory.getLogger(getClass());

其实最终还是以当前类的全名去获取logger,而我们的log4j2.xml中并没有设置name为指定的类名的logger。但是我们通常会设置这样一个logger:

 <logger name="com.sankuai.cx.etcp.code" level="info" additivity="false">
<appender-ref ref="INFO-LOG" />
<appender-ref ref="ERROR-LOG" />
<appender-ref ref="WARN-LOG" />
</logger>

根据以上所讲我们知道,这个logger其实是我们程序中要找的这个logger的父logger,所以即使找不到指定的类名的logger,还是可以使用这个父logger进行输出。

参考资料

https://www.cnblogs.com/SummerinShire/p/6498977.html

https://www.cnblogs.com/hlhdidi/p/6749572.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值