Springboot使用Log4j2的配置详解

日志框架的对比和选择

当前比较流行的日志框架有slf4j、log4j、logback、log4j2

  • 日志接口(slf4j)

slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)

  • 日志实现(log4j、logback、log4j2)

log4j是apache实现的一个开源日志组件
logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现,springboot默认的日志组件就是使用的logback

Log4j2是log4j 1.x的大幅度改进和汲取了logback许多优秀的设计,性能当前是最好的,官网说明如下:

官方的性能提升描述
大致意思就是在多线程环境下比log4j 1和logback有了大幅提升,另外在异步日志方面,比logback等提升了18倍。所以,这里决定使用Log4j2作为主要的日志处理框架。

一、依赖配置(pom文件)

由于springboot自带了logback的日志配置,因此如果要使用log4j2,则需要将springboot的starter中的logback配置排除掉:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>

然后重新添加log4j2的依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

二、log4j2.xml文件的配置

需要在项目的资源根路径(src/main/resources)创建log4j2.xml文件
log4j2.xml文件目录
文件内容大致如下:

<?xml version="1.0" encoding="UTF-8"?>

<!--
    status="warn" 日志框架本身的输出日志级别,可以修改为debug
    monitorInterval="1800" 自动加载配置文件的间隔时间,不低于 1800秒;生产环境中修改配置文件,是热更新,无需重启应用
 -->
<Configuration status="WARN" monitorInterval="1800">
 <!--
   全局属性配置
    使用时通过:${name}
    -->
    <properties>
        <property name="LOG_HOME">/var/logs/test-project</property>
        <property name="REQUEST_FILE_NAME">request</property>
        <property name="INFO_FILE_NAME">log-info</property>
    </properties>

 <!-- 日志处理 -->
    <Appenders>
    <!-- 控制台输出 appender,SYSTEM_OUT输出黑色,SYSTEM_ERR输出红色 -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>

        <RollingRandomAccessFile name="info-log"
                                 fileName="${LOG_HOME}/${INFO_FILE_NAME}.log"
                                 filePattern="${LOG_HOME}/$${date:yyyy-MM}/${INFO_FILE_NAME}-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout
                    pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="200 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="200"/>
        </RollingRandomAccessFile>

        <RollingRandomAccessFile name="request-log"
                                 fileName="${LOG_HOME}/${REQUEST_FILE_NAME}.log"
                                 filePattern="${LOG_HOME}/$${date:yyyy-MM}/${REQUEST_FILE_NAME}-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout
                    pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="200 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="200"/>
        </RollingRandomAccessFile>
    </Appenders>
  <!-- logger 定义 -->
    <Loggers>
      <!-- 使用 rootLogger 配置 日志级别 level="info" -->
        <Root level="info">
            <AppenderRef ref="info-log" />
            <AppenderRef ref="Console" />
        </Root>
        <Logger name="request" level="info"
                additivity="false">
            <AppenderRef ref="request-log"/>
        </Logger>
        <Logger name="org.springframework">
            <AppenderRef ref="Console" />
        </Logger>
    </Loggers>
</Configuration>

三、Log4j2.xml配置文件核心概念解析

log4j2.xml配置文件主要参数配置如下:

在这里插入图片描述

  • Configuration:为根节点,有status和monitorInterval等多个属性
    • status的值有 “trace”, “debug”, “info”, “warn”, “error” ,“fatal”,用于控制log4j2日志框架本身的日志级别,如果将stratus设置为较低的级别就会看到很多关于log4j2本身的日志,如加载log4j2配置文件的路径等信息
    • monitorInterval,含义是每隔多少秒重新读取配置文件,可以不重启应用的情况下修改配置

1、全局Property

这里可以设置全局的参数,在后面的输出源或者Logger日志器中使用,使用的时候,需要使用${参数名称}来使用,例如以下:

 fileName="${LOG_HOME}/${INFO_FILE_NAME}.log

其中的${LOG_HOME}就是引用了上面的property定义的参数

2、Appender(日志输出源

官方给出的定义如下:
在这里插入图片描述
Appender就是日志输出源,就是日志实际输出的文件的,log4j2支持的输出源有很多,有控制台Console、文件File、RollingRandomAccessFile、MongoDB、Flume 等:

  • Console:控制台输出源是将日志打印到控制台上,开发的时候一般都会配置,以便调试
  • File:文件输出源,用于将日志写入到指定的文件,需要配置输入到哪个位置(例如:D:/logs/mylog.log)
  • RollingRandomAccessFile: 该输出源也是写入到文件,不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则,这种方式更加实用,因为你不可能一直往一个文件中写,如果一直写,文件过大,打开就会卡死,也不便于查找日志。
  • fileName 指定当前日志文件的位置和文件名称
  • filePattern 指定当发生Rolling时,文件的转移和重命名规则
  • SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling
  • DefaultRolloverStrategy 指定最多保存的文件个数
  • TimeBasedTriggeringPolicy
    这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd
    HH-mm}-%i,最小的时间粒度是mm,即分钟
  • TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd
    HH},最小粒度为小时,则每一个小时生成一个文件
  • NoSql:MongoDb, 输出到MongDb数据库中
  • Flume:输出到Apache
    Flume(Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。)
  • Async:异步,需要通过AppenderRef来指定要对哪种输出源进行异步(一般用于配置RollingRandomAccessFile)

使用说明:
常用的是 RollingFile Appender或者RollingRandomAccessFile,它们是一种io 输出流(OutputStreamAppender ),将日志事件写到filePattern指定的路径的fileName名称的日志文件中,日志的滚动和归档的规则需要根据滚动策略的配置。主要策略为TriggeringPolicy(触发策略) 策略和 RolloverPolicy(覆盖策略),这两个策略可以联合起来使用。
如需要定义日志根据日期归档,同时还要根据每个日志文件大小达到一定的值,则日志切割成多个日志文件,例如,需要日志按照日期和日志大小来切割,则需要使用TimeBasedTriggeringPolicy 和 SizeBasedTriggeringPolicy 。TimeBasedTriggeringPolicy 这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd}-%i,最小的时间粒度是dd,即天,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1天生成一个新文件。如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件,SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling,以上的配置配置的是200MB,总体结合起来就是每天生成一个日志问价,如果日志文件大小超过200MB,则会分隔成_1,_2…等后缀的日志文件。

3、日志记录的输出格式PatternLayout

日志文件里面每一行日志数据的格式都需要定义指定的样式,例如:

   <PatternLayout
 pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>

则日志会输出格式如下的日志:

在这里插入图片描述
详细参数解析如下:
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间

%t 输出当前线程名称

%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0

%logger 输出logger名称,因为Root Logger没有名称,所以没有输出

%msg 日志文本

%n 换行

其他常用的占位符有:

%F 输出所在的类文件名,如Client.java

%L 输出行号

%M 输出所在方法名

%l 输出语句所在的行数, 包括类名、方法名、文件名、行数

4、Loggers:日志器

日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。对于Loggers中level的定义同样适用。

1)、Root Logger

配置如下:

        <Root level="info">
            <AppenderRef ref="info-log" />
            <AppenderRef ref="Console" />
        </Root>

配置了logger的日志级别,以及引用的输出源

2)、 其他Logger

除了可以声明root logger之外,还可以声明自定义的logger,并指定引用哪个输出源:

       <Logger name="request" level="info"
                additivity="false">
            <AppenderRef ref="request-log"/>
        </Logger>
        <Logger name="org.springframework">
            <AppenderRef ref="Console" />
        </Logger>

四、异步日志

由于项目暂时用不上异步日志,还未深入了解,待后面了解了再补充

引用:

[1] http://www.masterspringboot.com/configuration/logging/configuring-log4j2-in-spring-boot-applications
[2] http://logging.apache.org/log4j/2.x/
[3] https://blog.csdn.net/weixin_32265569/article/details/110723441

猜你喜欢

转载自blog.csdn.net/weixin_46589575/article/details/113598995
今日推荐