Liuqichun's Blog

轻松搞懂 Log4j2 配置

入门

百度百科

Log4j 是 Apache 的一个开源项目,通过使用 Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI 组件,甚至是套接口服务器、NT 的事件记录器、UNIX Syslog 守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

Log4j 工作流程

Log4j 的三个重要组成:Logger(日志产生)、Layout(格式化)、Appender(日志输出)。 在这个过程中,Logger 是日志的产生源,Appender 负责把产生的日志输出到各个目的地(console/file/database…),Layout 负责格式化日志。

maven 依赖

 1	<!--log4j2jar-->
 2    <dependency>
 3        <groupId>org.apache.logging.log4j</groupId>
 4        <artifactId>log4j-api</artifactId>
 5        <version>2.12.1</version>
 6    </dependency>
 7    <dependency>
 8        <groupId>org.apache.logging.log4j</groupId>
 9        <artifactId>log4j-core</artifactId>
10        <version>2.12.1</version>
11    </dependency>
12    <!--log4j2的slf4j实现-->
13     <dependency>
14        <groupId>org.apache.logging.log4j</groupId>
15        <artifactId>log4j-slf4j-impl</artifactId>
16        <version>2.12.1</version>
17    </dependency>

log4j2 展示(简单了解即可)

Log4j2 配置文件可以有多种格式:xml、yaml、json 等。 项目中常用的是 xml。在 xml 方式配置中又分为严格模式和非严格模式。

非严格模式示例

 1<?xml version="1.0" encoding="UTF-8"?>
 2<Configuration status="WARN">
 3  <Appenders>
 4    <Console name="Console" target="SYSTEM_OUT">
 5      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
 6    </Console>
 7  </Appenders>
 8  <Loggers>
 9    <Root level="error">
10      <AppenderRef ref="Console"/>
11    </Root>
12  </Loggers>
13</Configuration>

严格模式示例

 1<?xml version="1.0" encoding="UTF-8"?>;
 2<Configuration>
 3  <Properties>
 4    <Property name="name1">value</property>
 5    <Property name="name2" value="value2"/>
 6  </Properties>
 7  <Filter type="type" ... />
 8  <Appenders>
 9    <Appender type="type" name="name">
10      <Filter type="type" ... />
11    </Appender>
12    ...
13  </Appenders>
14  <Loggers>
15    <Logger name="name1">
16      <Filter type="type" ... />
17    </Logger>
18    ...
19    <Root level="level">
20      <AppenderRef ref="name"/>
21    </Root>
22  </Loggers>
23</Configuration>

区别: 严格模式中 Appender 的类型是通过属性表示的(<Appender type="Console" name="STDOUT">),非严格模式 Appender 类型是通过标签表示的( <Console name="Console" target="SYSTEM_OUT">),这是比较明显的区别之一,当然不止这一点。

xml 配置文件标签及属性(重要)

==以下为非严格配置==

配置文件结构


Configuration : 根配置标签

Appenders:输出源,用于定义日志输出的地方

下面配置了两个输出源Console和RollingRandomAccessFIle,第一个是打印到控制台,第二个是输出到文件(当日志文件达到 20M 就会被分割存储到单独文件)

 1    <Appenders>
 2        <Console name="Console" target="SYSTEM_OUT">
 3            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %m%n" />
 4        </Console>
 5        <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${LOG_HOME}/${FILE_NAME}"
 6                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
 7            <PatternLayout pattern="%d %p %c{1.} [%t] - %m%n"/>
 8            <Policies>
 9                <TimeBasedTriggeringPolicy />
10                <SizeBasedTriggeringPolicy size="20 MB"/>
11            </Policies>
12            <DefaultRolloverStrategy max="10"/>
13        </RollingRandomAccessFile>
14    </Appenders>

Loggers :日志器, 日志产生源 日志器分: 根日志器 Root和自定义日志器 Logger,当根据日志名字获取不到指定的日志器时就使用 Root 作为默认的日志器,自定义时需要指定每个 Logger 的名称 name(对于命名可以以包名作为日志的名字,不同的包配置不同的级别等),日志级别 level,相加性 additivity(是否继承下面配置的日志器), 对于一般的日志器(如 Console、File、RollingRandomAccessFile)一般需要配置一个或多个输出源 AppenderRef; 下面这个例子中有两个产生源 Root 和 UserController 类的 Logger,在产生源上可以设日志过滤等级(All < Trace < Debug < Info < Warn < Error < Fatal < OFF),all 会显示所有日志,info 则只显示大于等于 info 的日志。

 1    <Loggers>
 2        <Root level="all">
 3            <AppenderRef ref="Console" />
 4            <AppenderRef ref="RollingRandomAccessFile" />
 5        </Root>
 6        <Logger name="com.marchsoft.controller.UserController" level="info" additivity="false">
 7            <AppenderRef ref="Console" />
 8            <AppenderRef ref="RollingRandomAccessFile" />
 9        </Logger>
10    </Loggers>

Filter Filter 用于过滤一些日志信息,Filter 在过滤每一条日志时都会返回一个值 ACCEPT、 DENY 或者 NEUTRAL。 不同的 Filter 有不同的用处,BurstFilter 用于防止日志流量过大,还可以使用 DynamicThresholdFilter 根据属性来过滤特定级别的日志。可以根据具体的需要选择相应的 Filter。

properties : 自定义属性,以便在其他地方引用,引用方式为${自定义属性}

1	<!-- 定义 -->
2    <properties>
3        <property name="LOG_HOME">D:/logs</property>
4        <property name="FILE_NAME">mylog.txt</property>
5    </properties>
6
7	<!--使用, 在fileName属性中引用-->
8	<RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${LOG_HOME}/${FILE_NAME}".../>

PatternLayout 中的 pattern 属性正则参数属性

%d 表示时间,默认情况下表示打印完整时间戳 2012-11-02 14:34:02,123,可以调整 %d 后面的参数来调整输出的时间格式
%p 表示输出日志的等级,可以使用 %highlight{%p} 来高亮显示日志级别
%c 用来输出类名,默认输出的是完整的包名和类名,%c{1.} 输出包名的首字母和完整类名
%t 表示线程名称
%m 表示日志内容,%M 表示方法名称
%n 表示换行符
%L 表示打印日志的代码行数

level日志过滤级别参数 All < Trace < Debug < Info < Warn < Error < Fatal < OFF

使用 Slf4j

maven 依赖

1<dependency>
2     <groupId>org.apache.logging.log4j</groupId>
3     <artifactId>log4j-slf4j-impl</artifactId>
4     <version>2.12.1</version>
5</dependency>

使用示例,在项目中使用时 logger 应该被定义成static的成员变量。

1import org.slf4j.Logger;
2import org.slf4j.LoggerFactory;
3public class Slf4jDemo {
4    public static void main(String[] args) {
5        Logger logger = LoggerFactory.getLogger(Slf4jDemo.class);
6
7        logger.info("Slf4j log info");
8    }
9}

完整配置示例

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!--根配置标签-->
 3<!--Configuration标签至少要指定status标签, status指定的为缺省日志显示等级-->
 4<Configuration status="WARN">
 5    <!--自定义属性通过${}来引用, 用自定已属性时为了方便同意管理-->
 6    <properties>
 7        <property name="LOG_HOME">D:/logs</property>
 8        <property name="FILE_NAME">mylog.txt</property>
 9    </properties>
10
11    <!--日志输出端, 可以时Console, File, RollingFile, RollingRandomAccessFile等等-->
12    <!--Rolling开头的输出端具有文本分割功能,可以按照时间(TimeBasedTriggeringPolicy)或者文件大小(SizeBasedTriggeringPolicy)进行分割-->
13    <!--RollingRandomAccessFileRollingRandomAccessFile 与 RollingFile 在功能上基本一致,但是底层的实现有所区别,RollingFileAppender 底层是 BufferedOutputStream,
14    RollingRandomAccessFileAppender 底层是使用 ByteBuffer + RandomAccessFile ,性能上有了很大的提升。-->
15    <Appenders>
16        <!--此处name为Console指定一个名称(可任意), target指定输出源名称(非任意)-->
17        <Console name="Console" target="SYSTEM_OUT">
18            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %m%n" />
19        </Console>
20        <!--name指定名称, fileName日志文件路径名称, filePattern分割日志路径名称, pattern日志内容的格式-->
21        <!--该Appender每天建一个日志分割文件夹,当mylog.txt文件达到20M,会将的内容转移到分割文件,此时mylog.txt中不会有之前的2M内容-->
22        <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${LOG_HOME}/${FILE_NAME}"
23                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
24            <PatternLayout pattern="%d %p %c{1.} [%t] - %m%n"/>
25            <Policies>
26                <!--interval日志颗粒度, 与filePattern有关联, 时间HH-mm颗粒度为分中, 时间HH颗粒度为消息, 时间yyy-MM-dd为天-->
27<!--                <TimeBasedTriggeringPolicy interval="1"/>-->
28                <!--size文件大小, 达到时对日志进行分割, 单位有MB、KB-->
29                <SizeBasedTriggeringPolicy size="20 MB"/>
30            </Policies>
31            <!--最大分割数量-->
32            <DefaultRolloverStrategy max="10"/>
33        </RollingRandomAccessFile>
34    </Appenders>
35    <!--日志器,产生日志-->
36    <Loggers>
37        <!--level日志输出级别-->
38        <Root level="all">
39            <!--指定该日志器输出的Appender, 此处对对控制台和文件进行输出-->
40            <AppenderRef ref="Console" />
41            <AppenderRef ref="RollingRandomAccessFile" />
42        </Root>
43
44        <Logger name="com.marchsoft.controller.UserController" level="all" additivity="false">
45            <AppenderRef ref="Console" />
46            <AppenderRef ref="RollingRandomAccessFile" />
47        </Logger>
48    </Loggers>
49</Configuration>

测试

在这里插入图片描述 在这里插入图片描述

本文到这里就完了,你搞懂了吗?搞懂后就可以去自定义 Spring Boot 的日志了。对了,Spring Boot 目前默认的是 Logback 日志工具,不过配置几乎差不多。

(完)

<< Previous Post

|

Next Post >>

#Log4j #教程