我的项目中的log4j配置如下:
<configuration status="off"> <!--status=debug可以查看log4j的装配过程-->
<Properties> <!--指定日志打印的路径-->
<Property name="logdir">${catalina.base}/logs</Property> </Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT"> <!---->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level [%file] - %msg%n" />
</Console>
<RollingFile
name="RollingFile"
fileName="${logdir}/hloa.log" filePattern="${logdir}/hloa.%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level [%C{36}.%M] - %msg%n" />
<Filters>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
</RollingFile>
<!-- 只显示error级别的信息 -->
<RollingFile name="RollingFileError"
fileName="${logdir}/error.log" append="false" <!--这个log每次运行程序会自动清空,由append属性决定-->
filePattern="${logdir}/error-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss.SSS} [%thread] %level [%C{36}.%M:%L] - %msg%xEx%n" />
<Filters> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.hl" level="debug" /> <!--建立一个默认的root的logger-->
<Root level="debug" additivity="false"> <!-- 表示log只打印到本log的appender中,而不再打印到其父logger的appender -->
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
<AppenderRef ref="RollingFileError" />
</Root>
</Loggers>
</configuration>
日志级别:
trace: 是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。
debug: 调试么,我一般就只用这个作为最低级别,trace压根不用。实在没办法就用eclipse或者idea的debug功能就好了么。
info: 输出一下你感兴趣的或者重要的信息,这个用的最多了。
warn: 有些信息不是错误信息,但是也要给程序员的一些提示,类似于eclipse中代码的验证不是有error 和warn(不算错误但是也请注意,比如以下 depressed的方法)。
error: 错误信息。用的也比较多。
fatal: 级别比较高了。重大错误,这种级别你可以直接停止程序了,是不应该出现的错误么!不用那么紧张,其实就是一个程度的问题。
节点分类:
1)根节点configuration,然后有两个子节点:appenders和loggers(都是复数,意思就是可以定义很多个appender和logger了)(如果想详细的看一下这个xml的结构,可以去jar包下面去找xsd文件和dtd文件)
2)appenders:这个下面定义的是各个appender,就是输出了,有好多类别,这里也不多说(容易造成理解和解释上的压力,一开始也未必能听懂,等于白讲),先看这个例子,只有一个Console,这些节点可不是随便命名的,Console就是输出控制台的意思。然后就针对这个输出设置一些属性,这里设置了PatternLayout就是输出格式了,基本上是前面时间,线程,级别,logger名称,log信息等,差不多,可以自己去查他们的语法规则。
3)loggers下面会定义许多个logger,这些logger通过name进行区分,来对不同的logger配置不同的输出,方法是通过引用上面定义的logger,注意,appender-ref引用的值是上面每个appender的name,而不是节点名称。
ThresholdFilter 中参数设置:
字段 描述 level 输出级别,例:level=”info”,日志级别为info或者以上(匹配的界别) onMatch DENY/ACCEPT 禁止或者接受(是否接受匹配) onMismatch DENY/NEUTRAL (是否接受其他高于level的级别)
一般的组合为:
- onMatch=”DENY” onMismatch=”NEUTRAL “
- onMatch=”ACCEPT ” onMismatch=”DENY”
<Console name="Console" target="SYSTEM_OUT"> <!---->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level [%file] - %msg%n" />
</Console>
如上所示:如果onMatch=”ACCEPT ” 就代表输出info以及以上级别的日志 onMismatch=”DENY” 不匹配的info以下就拒绝显示。
如果设置为 onMismatch=”NEUTRAL “ 就可以显示全部级别的日志。
变量以及日志备份:
Properties可以制定公共变量后面可以使用${}引用此变量,如下:
<Properties>
<Property name="logdir">base/logs</Property>
</Properties>
<Appenders>
<RollingFile name="RollingFile"
fileName="${logdir}/hloa.log"
filePattern="${logdir}/hloa.%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level [%C{36}.%M] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
</Policies>
</RollingFile>
.............
如上所示使用${logdir}引用了上面的变量,fileName制定了日志以后打印在此路径之下。filepatten是备份日志的路径以及名称,备份的的触发条件是按时间备份 interval="1"是1天备份一份。也可以制定按大小备份 <SizeBasedTriggeringPolicy size="100 MB" /> 意思每到100MB备份一个日志
内容详情:
pattern格式配置
%d{yyyy-MM-dd HH:mm:ss.SSS} “d”, “date” 时间格式
%-5level “p”, “level” 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%class{1.} “C”, “class” 类名,包名只有1位
%C{3} 获取类名前3级目录(包含类名)
%L “L”, “line” 输出行号
%M “M”, “method” 输出所在方法名
%m “m”, “msg”, “message” 日志文本
%xEx “xEx”, “xThrowable”, “xException” ExtendedThrowablePatternConverter
“ex”, “throwable”, “exception” ThrowablePatternConverter
“rEx”, “rThrowable”, “rException” RootThrowablePatternConverter
%n 换行
其他占位符有(部分):
%l “l”, “location” 输出语句所在的行数, 包括类名、方法名、文件名、行数 例如:hahaha.Log4j2Test.main(Log4j2Test.java:15)
%T “T”, “tid”, “threadId” 输出线程ID
%t “t”, “tn”, “thread”, “threadName” 输出当前线程名称
%tp “tp”, “threadPriority” 输出线程权级
%F “F”, “file” 输出所在的类文件名,如Log4j2Test.java
%logger “c”, “logger” 输出logger名称,LogManager.getLogger(Log4j2Test.class);中的名称,此处是hahaha.Log4j2Test
%N “N”, “nano” 纳秒
%sn “sn”, “sequenceNumber” 日志计数(全局)
%u “u”, “uuid” UUID(全局)
%X{ip} “X”, “mdc”, “MDC” MDC方式获取ip(等同于 %MDC{ip} 和 %mdc{ip} )
%x “x”, “NDC” NDC方式
现在你会配置log4j2了吗?欢迎留言交流。