在项目中,可能会产生非常多的日志记录,为了方便日志分析,一般可以将日志按级别输出到指定文件,本次就先说说log4j2的实现吧:
1、先加入log4j2依赖包
2、写一个java类进行测试,类文件中仅仅写几行日志:
1 package com.jessezeng.log4j2.test; 2 3 import org.apache.logging.log4j.LogManager; 4 import org.apache.logging.log4j.Logger; 5 6 public class Test { 7 8 private static Logger log=LogManager.getLogger(Test.class); 9 public static void main(String[] args) { 10 log.info("info test..................."); 11 log.error("error test..................."); 12 } 13 }
3、配置log4j2xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- status="OFF",可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF --> 3 <configuration status="OFF"> 4 <!-- 定义下面的引用名 --> 5 <Properties> 6 <property name="log_pattern"> %d %-5p [%c] %m%n</property> 7 <property name="basePath">/logs</property> 8 9 <property name="common-msg">${basePath}/common.log</property> 10 <property name="rollingfile_common-msg">${basePath}/common%d{yyyy-MM-dd}.log</property> 11 12 <property name="error-msg">${basePath}/error.log</property> 13 <property name="rollingfile_error-msg">${basePath}/error%d{yyyy-MM-dd}.log</property> 14 15 </Properties> 16 <!--先定义所有的appender --> 17 <appenders> 18 <!--输出控制台的配置 --> 19 <Console name="Console" target="SYSTEM_OUT"> 20 <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> 21 <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> 22 <!--输出日志的格式 --> 23 <PatternLayout pattern="${log_pattern}" /> 24 </Console> 25 26 <!--打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 --> 27 <!-- 按月生成归档日志,可以使用 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log" --> 28 <RollingFile name="rollingfile_common-msg" 29 filename="${common-msg}" filePattern="${rollingfile_common-msg}" 30 append="true"> 31 <Filters> 32 <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> 33 <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> 34 </Filters> 35 <Policies> 36 <TimeBasedTriggeringPolicy /> 37 </Policies> 38 </RollingFile> 39 40 <RollingFile name="rollingfile_error-msg" 41 filename="${error-msg}" filePattern="${rollingfile_error-msg}" 42 append="true"> 43 <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> 44 <PatternLayout> 45 <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %class{36} %L %M - %msg%xEx%n</Pattern> 46 </PatternLayout> 47 <Policies> 48 <TimeBasedTriggeringPolicy /> 49 </Policies> 50 </RollingFile> 51 </appenders> 52 <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 --> 53 <loggers> 54 <AsyncLogger name="net.shgaoxin.log4j2test" level="info" additivity="false" includeLocation="true"> 55 <AppenderRef ref="rollingfile_common-msg" /> 56 <AppenderRef ref="rollingfile_error-msg" /> 57 </AsyncLogger> 58 </loggers> 59 </configuration>
需要注意的是ThresholdFilter的onMatch/onMismatch的三个选项值:ACCEPT/DENY/NEUTRAL,如果有多个ThresholdFilter,那么Filters是必须的,在Filters中,首先要过滤不符合的日志级别,把不需要的首先DENY掉,然后再ACCEPT需要的日志级别,同时也需要注意次序。