本方法于2018-02-13号运行通过。
一、log4j2 配置文件结构图
二、log4j2 Maven
先删除log4j 1.x版本的依赖,删除log4j.properties,再加入log4j2的依赖。log4j-slf4j-impl中包括了log4j-core和log4j-api
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.10.0</version> </dependency>
三、log4j2 配置文件加载
log4j2 的配置文件只用 xml、json、jsn 三种格式,默认情况下由系统自动加载,系统加载 classpath 目录如下的配置文件:
- log4j-test.json/log4j-test.jsn/log4j2-test.xml
- log4j.json/log4j.jsn/log4j2.xml
加载优先级由上向下,且只加载其一。
四、log4j2 配置文件说明
如果是Servlet2.5及以下版本,需要在web.xml里加入以下代码,3.0及以上版本不需要。
<listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener> <filter> <filter-name>log4jServletFilter</filter-name> <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class> </filter> <filter-mapping> <filter-name>log4jServletFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> <dispatcher>ASYNC</dispatcher><!-- Servlet 3.0 w/ disabled auto-initialization only; not supported in 2.5 --> </filter-mapping>
log4j2.xml
<?xml version="1.0" encoding="UTF-8" ?> <!-- configure.status 为设置日志输出级别,级别如下:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE 、ALL --> <!-- configure.monitorInterval 监控间隔,指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置 --> <Configuration status="WARN" monitorInterval="600"> <Properties> <!--配置日志文件输出目录,此配置将日志输出到tomcat所在盘(支持Windows和Linux)根目录下的指定文件夹--> <Property name="LOG_HOME">/logs/reinforce</Property> <property name="LOG_BACK_HOME">${LOG_HOME}/backup</property> <property name="TRACE_FILE_NAME">trace</property> <property name="ERROR_FILE_NAME">error</property> <property name="WARN_FILE_NAME">warn</property> <property name="INFO_FILE_NAME">info</property> <property name="DEBUG_FILE_NAME">debug</property> <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${sys:PID} --- [%15thread] %-45logger{45} : %m%n</property> <property name="PATTERN_OUT">%d{yyyy-MM-dd HH:mm:ss.SSS} %green{%-5level} %magenta{${sys:PID}} --- [%15thread] %cyan{%-45logger{45}} : %m%n</property> </Properties> <Appenders> <!--这个输出控制台的配置,这里输出除了info,warn和error级别的信息到System.out--> <Console name="console_out_appender" target="SYSTEM_OUT"> <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 输出日志的格式 --> <PatternLayout pattern="${PATTERN_OUT}"/> <withJansi>true</withJansi> </Console> <!-- TRACE级别日志 --> <!-- 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内, 日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号,此appender只输出trace级别的数据到trace.log --> <RollingRandomAccessFile name="TraceLog" fileName="${LOG_HOME}/${TRACE_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${TRACE_FILE_NAME}.%d{yyyy-MM-dd}.log"> <PatternLayout pattern="${PATTERN}"/> <Policies> <!-- 每个日志文件最大5MB --> <SizeBasedTriggeringPolicy size="5MB"/> </Policies> <Filters><!-- 此Filter意思是,只输出debug级别的数据 --> <!-- DENY,日志将立即被抛弃不再经过其他过滤器; NEUTRAL,有序列表里的下个过滤器过接着处理日志; ACCEPT,日志会被立即处理,不再经过剩余过滤器。 --> <ThresholdFilter level="debug" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </RollingRandomAccessFile> <!-- 配置日志输出文件名字 追加读写 --> <!-- Error console log --> <RollingFile name="ErrLog" fileName="${LOG_HOME}/${ERROR_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${ERROR_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true"> <!-- 输出格式 --> <PatternLayout pattern="${PATTERN}"/> <!-- 设置策略 --> <Policies> <!-- 基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数: interval,integer型,指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位, 比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟 modulate,boolean型,说明是否对封存时间进行调制。若modulate=true, 则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours, 那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00, 之后的封存时间依次为08:00,12:00,16:00 --> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> <Filters> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </RollingFile> <!-- Warn console log --> <RollingFile name="WarnLog" fileName="${LOG_HOME}/${WARN_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${WARN_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true"> <!-- 输出格式 --> <PatternLayout pattern="${PATTERN}"/> <!-- 设置策略 --> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> <Filters> <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </RollingFile> <!-- Info console log --> <RollingFile name="InfoLog" fileName="${LOG_HOME}/${INFO_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${INFO_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true"> <!-- 输出格式 --> <PatternLayout pattern="${PATTERN}"/> <!-- 设置策略 --> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> <Filters> <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </RollingFile> <!-- Debug console log --> <RollingFile name="DebugLog" fileName="${LOG_HOME}/${DEBUG_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${DEBUG_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true"> <!-- 输出格式 --> <PatternLayout pattern="${PATTERN}"/> <!-- 设置策略 --> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> <Filters> <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> </RollingFile> </Appenders> <Loggers> <!-- 配置日志的根节点 --> <root level="trace"> <appender-ref ref="console_out_appender"/> <AppenderRef ref="TraceLog" /> <AppenderRef ref="InfoLog" /> <AppenderRef ref="WarnLog" /> <AppenderRef ref="ErrLog" /> <AppenderRef ref="Console"/> </root> <!-- 第三方日志系统 --> <logger name="org.springframework.core" level="info"/> <logger name="org.springframework.beans" level="info"/> <logger name="org.springframework.context" level="info"/> <logger name="org.springframework.web" level="info"/> <logger name="org.jboss.netty" level="warn"/> <logger name="org.apache.http" level="warn"/> </Loggers> </Configuration>
五、代码中使用
private static Logger logger = LogManager.getLogger(xxx.class.getName()); logger.info("info"); logger.error("error"); logger.warn("warn");
六、一些系统变量
PID ------- ${sys:PID}