log4j2按日志级别输出到指定文件

时间:2022-07-23 21:49:51

在项目中,可能会产生非常多的日志记录,为了方便日志分析,一般可以将日志按级别输出到指定文件,本次就先说说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需要的日志级别,同时也需要注意次序。