log4j 2.x 配置文件分享.

来源:互联网 发布:华为荣耀4x手机套淘宝 编辑:程序博客网 时间:2024/06/05 09:32

最新开发的项目中,使用了log4j 2.x 管理日志。在此分享我使用的配置文件和我遇到的一些问题。

使用log4j 2.x 需要导入log4j-api和log4j-core两个jar包。因为项目为Maven工程,只需pom.xml配置

<!-- log4j 2.x --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency>
配置文件log4j2.xml,放在工程src目录下。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd"> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出--> <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数--> <configuration status="WARN" monitorInterval="30">     <!--先定义所有的appender-->     <appenders>     <!--这个输出控制台的配置-->         <console name="Console" target="SYSTEM_OUT">         <!--输出日志的格式-->             <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss}[%l:%c:%t:%r]-[%p]%m%n"/>         </console>     <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->     <File name="log" fileName="log/test.log" append="false">        <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>     </File>     <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->         <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">             <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->                     <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>             <Policies>                 <TimeBasedTriggeringPolicy/>                 <SizeBasedTriggeringPolicy size="100 MB"/>             </Policies>         </RollingFile>         <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">             <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>             <Policies>                 <TimeBasedTriggeringPolicy/>                 <SizeBasedTriggeringPolicy size="100 MB"/>             </Policies>         <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->             <DefaultRolloverStrategy max="20"/>         </RollingFile>         <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>             <Policies>                 <TimeBasedTriggeringPolicy/>                 <SizeBasedTriggeringPolicy size="100 MB"/>             </Policies>         </RollingFile>     </appenders>     <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->     <loggers>         <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->         <logger name="org.springframework" level="INFO"></logger>         <logger name="org.mybatis" level="INFO"></logger>         <root level="all">             <appender-ref ref="Console"/>             <appender-ref ref="RollingFileInfo"/>             <appender-ref ref="RollingFileWarn"/>             <appender-ref ref="RollingFileError"/>         </root>     </loggers> </configuration>
这个配置文件是官方给出的demo,在使用过程中,发现两个问题。

1.项目需求日志文件以 *.log.yyyy-MM-dd格式,但是将 %d{yyyy-MM-dd} 替换后,会报异常,在查找资料后发现要使用${date:yyyy-MM-dd}。具体原因没有查明,有知道的腿腿可以留言回复,帮我解答一下。

2.项目需求输出两个日志文件,一个为info级别,一个为error级别。当按照上述配置后,发现info级别log中会出现error log信息。查找官方文档。

This filter returns the onMatch result if the level in the LogEvent is the same or more specific than the configured level and the onMismatch value otherwise. For example, if the ThresholdFilter is configured with Level ERROR and the LogEvent contains Level DEBUG then the onMismatch value will be returned since ERROR events are more specific than DEBUG.

在使用ThresholdFilter时,当输出log级别大于等于Level配置级别时,会按照onMatch输出log。所以当只想输出某一级别log时需要加两个Filter。

<Filters><ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL" /><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" /></Filters>

这样配置之后就可以只输出INFO级别日志。

刚刚参加工作,对于一些技术理解不全面,有所误区希望指出,谢谢。