日志级别
从低到高
级别 |
说明 |
trace |
追踪,是最低的日志级别,相当于追踪程序的执行,一般不怎么使用 |
debug |
一般在开发中,都将其设置为最低的日志级别,一般程序调试时使用,日志打印的详细些,方便调试 |
info |
输出感兴趣的信息,方便了解程序执行的过程,通过日志排查问题时比较有用 |
warn |
警告.有些时候,虽然程序不会报错,但是还是需要通知负责人关注 |
error |
错误,程序出错,可以是预料中的或者是预料之外的错误,都需要密切关注 |
fatal |
极其重大的错误。一般使用不到,最高级别的也就是error |
配置示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| <?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"/> <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 |
|
|
monitorInterval |
Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。 |
|
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及以上的日志。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <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>
<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中打印。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <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>
<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
1
| Logger logger = LoggerFactory.getLogger(getClass());
|
其实最终还是以当前类的全名去获取logger,而我们的log4j2.xml中并没有设置name为指定的类名的logger。但是我们通常会设置这样一个logger:
1 2 3 4 5
| <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