【使用篇二】SpringBoot的日志体系及如何开启logback日志(15)

抄自:<https://blog.csdn.net/liujun03/article/details/82684209&gt;

Java应用中,日志一般分为以下5个级别(从高到低):

  • ERROR 错误信息
  • WARN 警告信息
  • INFO 一般信息
  • DEBUG 调试信息
  • TRACE 跟踪信息

Spring Boot使用Apache的Commons Logging作为内部的日志框架,其仅仅是一个日志接口,在实际应用中需要为该接口来指定相应的日志实现。

Spring Boot从1.4版本开始内置的日志框架就是Logback;Spring Boot 2.x 默认采用了slf4j+logback的形式,slf4j也是个通用的日志门面。

但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J等,它的内部逻辑就是通过特定的JAR包去适配各个不同的日志框架。

注:SpringBoot能自动适配所有的日志,其底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可,因为Spring Boot会通过自己的jar去替代。

一、Logback的使用

在resources下创建logback-spring.xml:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&lt;!-- 日志级别从低到高分为TRACE &lt; DEBUG &lt; INFO &lt; WARN &lt; ERROR &lt; FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --&gt;
&lt;!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --&gt;
&lt;!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --&gt;
&lt;!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --&gt;
&lt;configuration debug=&quot;true&quot; scan=&quot;true&quot;&gt;
    &lt;!-- 日志级别 --&gt;
    &lt;springProperty scope=&quot;context&quot; name=&quot;LOG_ROOT_LEVEL&quot; source=&quot;logging.level.root&quot; defaultValue=&quot;DEBUG&quot;/&gt;
    &lt;!--  标识这个&quot;STDOUT&quot; 将会添加到这个logger --&gt;
    &lt;springProperty scope=&quot;context&quot; name=&quot;STDOUT&quot; source=&quot;log.stdout&quot; defaultValue=&quot;STDOUT&quot;/&gt;
    &lt;!-- 日志格式,%d:日期;%thread:线程名;%-5level:日志级别从左显示5个字符长度,列如:DEBUG;
        %logger{36}:java类名,例如:com.muses.taoshop.MyTest,36表示字符长度;%msg:日志内容;%d:换行 --&gt;
    &lt;property name=&quot;LOG_PATTERN&quot;
              value=&quot;%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&quot; /&gt;
    &lt;!-- root日志级别--&gt;
    &lt;property name=&quot;${LOG_ROOT_LEVEL}&quot; value=&quot;DEBUG&quot; /&gt;
    &lt;!-- 日志根目录 --&gt;
    &lt;property name=&quot;LOG_HOME&quot; value=&quot;data/logs&quot; /&gt;
    &lt;!-- 日志文件路径--&gt;
    &lt;property name=&quot;LOG_DIR&quot; value=&quot;${LOG_HOME}/%d{yyyyMMdd}&quot; /&gt;
    &lt;!-- 日志文件名称 --&gt;
    &lt;property name=&quot;LOG_PREFIX&quot; value=&quot;portal&quot; /&gt;
    &lt;!-- 日志文件编码 --&gt;
    &lt;property name=&quot;LOG_CHARSET&quot; value=&quot;utf-8&quot; /&gt;
    &lt;!-- 配置日志的滚动时间,保存时间为15天--&gt;
    &lt;property name=&quot;MAX_HISTORY&quot; value=&quot;15&quot; /&gt;
    &lt;!-- 文件大小,默认为10MB--&gt;
    &lt;property name=&quot;MAX_FILE_SIZE&quot; value=&quot;10&quot; /&gt;

    &lt;!-- 打印到控制台 --&gt;
    &lt;appender name=&quot;STDOUT&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&gt;
        &lt;!-- 格式化日志内容--&gt;
        &lt;encoder&gt;
            &lt;pattern&gt;${LOG_PATTERN}&lt;/pattern&gt;
        &lt;/encoder&gt;
    &lt;/appender&gt;
    &lt;!-- 打印所有日志,保存到文件--&gt;
    &lt;appender name=&quot;FILE_ALL&quot;
              class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
        &lt;file&gt;${LOG_HOME}/all_${LOG_PREFIX}.log&lt;/file&gt;
        &lt;!-- 设置滚动策略,当日志文件大小超过${MAX_FILE_SIZE}时,新的日志内容写到新的日志文件--&gt;
        &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
            &lt;!-- 新的日志文件路径名称,%d:日期 %i:i是变量 --&gt;
            &lt;fileNamePattern&gt;${LOG_DIR}/all_${LOG_PREFIX}%d{yyyy-MM-dd}.%i.log&lt;/fileNamePattern&gt;
            &lt;!-- 保存日志15天 --&gt;
            &lt;maxHistory&gt;${MAX_HISTORY}&lt;/maxHistory&gt;
            &lt;timeBasedFileNamingAndTriggeringPolicy
                    class=&quot;ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP&quot;&gt;
                &lt;!-- 日志文件的最大大小 --&gt;
                &lt;maxFileSize&gt;${MAX_FILE_SIZE}&lt;/maxFileSize&gt;
            &lt;/timeBasedFileNamingAndTriggeringPolicy&gt;
        &lt;/rollingPolicy&gt;
        &lt;!-- 格式日志文件内容--&gt;
        &lt;layout class=&quot;ch.qos.logback.classic.PatternLayout&quot;&gt;
            &lt;pattern&gt;${LOG_PATTERN}&lt;/pattern&gt;
        &lt;/layout&gt;
    &lt;/appender&gt;

    &lt;!-- 打印错误日志,保存到文件--&gt;
    &lt;appender name=&quot;FILE_ERR&quot;
              class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
        &lt;file&gt;${LOG_HOME}/err_${LOG_PREFIX}.log&lt;/file&gt;
        &lt;!-- 设置滚动策略,当日志文件大小超过${MAX_FILE_SIZE}时,新的日志内容写到新的日志文件--&gt;
        &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
            &lt;!-- 新的日志文件路径名称,%d:日期 %i:i是变量 --&gt;
            &lt;fileNamePattern&gt;${LOG_DIR}/err_${LOG_PREFIX}%d{yyyy-MM-dd}.%i.log&lt;/fileNamePattern&gt;
            &lt;!-- 保存日志15天 --&gt;
            &lt;maxHistory&gt;${MAX_HISTORY}&lt;/maxHistory&gt;
            &lt;timeBasedFileNamingAndTriggeringPolicy
                    class=&quot;ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP&quot;&gt;
                &lt;!-- 日志文件的最大大小 --&gt;
                &lt;maxFileSize&gt;${MAX_FILE_SIZE}&lt;/maxFileSize&gt;
            &lt;/timeBasedFileNamingAndTriggeringPolicy&gt;
        &lt;/rollingPolicy&gt;
        &lt;!-- 格式日志文件内容--&gt;
        &lt;layout class=&quot;ch.qos.logback.classic.PatternLayout&quot;&gt;
            &lt;pattern&gt;${LOG_PATTERN}&lt;/pattern&gt;
        &lt;/layout&gt;
    &lt;/appender&gt;

    &lt;!-- rest template logger--&gt;
    &lt;!--&lt;logger name=&quot;org.springframework.web.client.RestTemplate&quot; level=&quot;DEBUG&quot; /&gt;--&gt;
    &lt;!--&lt;logger name=&quot;org.springframework&quot; level=&quot;DEBUG&quot; /&gt;--&gt;

    &lt;!--开发环境:打印控制台, 只有文件名定义为*-spring.xml才可以使用--&gt;
    &lt;springProfile name=&quot;dev&quot;&gt;
       &lt;!-- logback为java中的包 --&gt;
        &lt;logger name=&quot;com.linhw.demo&quot; level=&quot;DEBUG&quot; /&gt;
    &lt;/springProfile&gt;
    &lt;!-- 日志输出级别 --&gt;
    &lt;root leve=&quot;${LOG_ROOT_LEVEL}&quot;&gt;
        &lt;appender-ref ref=&quot;STDOUT&quot; /&gt;
        &lt;appender-ref ref=&quot;FILE_ALL&quot; /&gt;
        &lt;appender-ref ref=&quot;FILE_ERR&quot; /&gt;
    &lt;/root&gt;

&lt;/configuration&gt;

1. 根节点包含的属性

&lt;configuration&gt;&lt;/configuration&gt;
  • scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
  • scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
  • debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false

2. 设置上下文名称

&lt;contextName&gt;spring-boot-logging&lt;/contextName&gt;

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。

3. 设置变量

用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。

&lt;property name=&quot;LOG_HOME&quot; value=&quot;data/logs&quot; /&gt;

4. 子节点appender

appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。

(1) 控制台输出策略ConsoleAppender

&lt;!--控制台输出ConsoleAppender--&gt;
&lt;!--输出到控制台--&gt;
&lt;appender name=&quot;console&quot; class=&quot;ch.qos.logback.core.ConsoleAppender&quot;&gt;
    &lt;!-- 级别过滤 --&gt;
    &lt;filter class=&quot;ch.qos.logback.classic.filter.LevelFilter&quot;&gt;
        &lt;level&gt;ERROR&lt;/level&gt;
        &lt;onMatch&gt;ACCEPT&lt;/onMatch&gt;
        &lt;onMismatch&gt;DENY&lt;/onMismatch&gt;
    &lt;/filter&gt;
    &lt;encoder&gt;
        &lt;pattern&gt;%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n&lt;/pattern&gt;
    &lt;/encoder&gt;
&lt;/appender&gt;

filter是一个过滤器,表示对输出到控制台的日记进行过滤。有两种过滤器,分别为LevelFilter 和ThresholdFilter。执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日志将立即被抛弃不再经过其他过滤器;返回NEUTRAL,由序列表里的下个过滤器接着处理日志;返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。

其中LevelFilter 为级别过滤器,根据日志级别进行过滤。其下有三个子节点,level表示过滤的级别,用于配置符合过滤条件的操作,ACCEPT符合级别的输出到控制台,用于配置不符合过滤条件的操作,DENY不符合的拒绝输出到控制台。

ThresholdFilter为临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。

日志格式化:

  • %d{HH:mm:ss.SSS} :日志的输出时间
  • %contextName : 上下文名称
  • %thread : 输出日志的进程名字,这在Web应用以及异步任务处理中很有用
  • %-5level : 日志级别,并且使用5个字符靠左对齐
  • %logger{36} : 日志输出者的名字(一般为类名),名字最长36个字符,否则按照句点分割
  • %msg : 具体的日志消息
  • %n :换行符

(2) 输出到文件RollingFileAppender

&lt;!--输出到文件--&gt;
&lt;appender name=&quot;file&quot; class=&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;&gt;
    &lt;file&gt;${log.path}/spring-boot-logging.log&lt;/file&gt;
    &lt;rollingPolicy class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;&gt;
        &lt;fileNamePattern&gt;${log.path}/spring-boot-logging.%d{yyyy-MM-dd}.log.zip&lt;/fileNamePattern&gt;
        &lt;!-- 日志保存周期 --&gt;
        &lt;maxHistory&gt;30&lt;/maxHistory&gt;
        &lt;!-- 总大小 --&gt;
        &lt;totalSizeCap&gt;1GB&lt;/totalSizeCap&gt;
    &lt;/rollingPolicy&gt;
    &lt;encoder&gt;
        &lt;pattern&gt;%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n&lt;/pattern&gt;
    &lt;/encoder&gt;
&lt;/appender&gt;

常见的日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。RollingFileAppender用于切分文件日志。

其中file属性定义文件的带全路径的文件名,重要的是rollingPolicy的定义。

class=&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;是最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责触发滚动。

<fileNamePattern>${log.path}/spring-boot-logging.%d{yyyy-MMdd}.log.zip</fileNamePattern>定义了日志的切分方式——把每一天的日志归档到一个文件中,同理,可以使用%d{yyyy-MM-dd HH-mm}来定义精确到分的日志切分方式。

<maxHistory>30</maxHistory>表示只保留最近30天的日志

<totalSizeCap>1GB</totalSizeCap>用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志

5. 子节点root

&lt;root level=&quot;info&quot;&gt;
    &lt;appender-ref ref=&quot;console&quot; /&gt;
    &lt;appender-ref ref=&quot;file&quot; /&gt;
&lt;/root&gt;

root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性,默认是DEBUG。

其中可以包含零个或多个元素,表示我们定义的appender将会添加到我们定义的loger子节点中。

6. 子节点loger

<loger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>

<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性

  • name:用来指定受此loger约束的某一个包或者具体的某一个类。
  • level:用来设置打印级别,如果未设置此属性,那么当前loger将会继承上级的级别。
  • addtivity:是否向上级loger传递打印信息。默认是true。

<loger> 的实际使用有两种情况:

第一种是不指定level,不指定appender

&lt;root level=&quot;info&quot;&gt;
    &lt;appender-ref ref=&quot;console&quot; /&gt;
    &lt;appender-ref ref=&quot;file&quot; /&gt;
&lt;/root&gt;
&lt;logger name=&quot;com.baiding.logging.SpringBootLoggingApplicationTests&quot;/&gt;

这时候的处理流程是:当SpringBootLoggingApplicationTests执行日志方法时,首先交给<logger name="com.baiding.logging.SpringBootLoggingApplicationTests"/>处理(继承上级的level–info),将级别大于等于info的日志交给root,本身没有打印任何日志。

第二种是指定了level,指定了appender

&lt;root level=&quot;info&quot;&gt;
    &lt;appender-ref ref=&quot;console&quot; /&gt;
    &lt;appender-ref ref=&quot;file&quot; /&gt;
&lt;/root&gt;
&lt;!-- java中的包 --&gt;
&lt;logger name=&quot;com.baiding&quot; level=&quot;warn&quot; addtivity=&quot;false&quot;&gt;
    &lt;appender-ref ref=&quot;console&quot; /&gt;
&lt;/logger&gt;

此logger指定了level为warn,addtivity为false,不再向上级传递打印信息,若设置了<appender-ref>属性,但没有设置addtivity为false,则com.baiding包下的日志会先在名为console的appender记录一次,之后传递给上级,root又会在名为console和file的appender记录一次,这样就打印了两次了。

Spring Boot在使用logback记录日志时,推荐使用logback-spring.xml的格式,这样的话,日志框架就不直接加载日志的配置项,而是由SpringBoot解析日志配置,就可以使用SpringBoot 的高级Profile功能。

&lt;springProfile name=&quot;dev&quot;&gt;
    &lt;logger name=&quot;com.baiding&quot; level=&quot;info&quot;/&gt;
&lt;/springProfile&gt;

&lt;springProfile name=&quot;prod&quot;&gt;
    &lt;logger name=&quot;com.baiding&quot; level=&quot;warn&quot;/&gt;
&lt;/springProfile&gt;

可以在不同的节点中使用springProfile功能,用于指定某段配置只在某个环境下生效 。当然使用前,要激活profile。

二、切换Log4j2框架

Spring Boot虽然默认使用Logback日志框架,但其内部也集成了Log4j2框架。要知道的是,在Java中,Log4j2框架的性能是最强的,所以我们一般在程序中使用Log4j2框架。

首先,要在Spring Boot使用Log4j2的话,那么第一件事就是去除Logback的jar包,并引入Log4j2的jar。

&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
    &lt;exclusions&gt;
        &lt;exclusion&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-logging&lt;/artifactId&gt;
        &lt;/exclusion&gt;
    &lt;/exclusions&gt;
&lt;/dependency&gt;

&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-log4j2&lt;/artifactId&gt;
&lt;/dependency&gt;

上面就是在依赖Web模块的时候去除引用spring-boot-starter-logging.jar,之后依赖spring-boot-starter-log4j2.jar包。

之后在类路径下新建一个log4j2.xml, 其具体内容如下:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;!--日志级别以及优先级排序: OFF &gt; FATAL &gt; ERROR &gt; WARN &gt; INFO &gt; DEBUG &gt; TRACE &gt; ALL --&gt;
&lt;!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出--&gt;

&lt;!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数--&gt;
&lt;configuration status=&quot;WARN&quot; monitorInterval=&quot;30&quot;&gt;

    &lt;Properties&gt;
        &lt;Property name=&quot;log.path&quot;&gt;log&lt;/Property&gt;
    &lt;/Properties&gt;

    &lt;!--先定义所有的appender--&gt;
    &lt;appenders&gt;

        &lt;!--这个输出控制台的配置--&gt;
        &lt;console name=&quot;Console&quot; target=&quot;SYSTEM_OUT&quot;&gt;
            &lt;!--输出日志的格式--&gt;
            &lt;PatternLayout pattern=&quot;[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n&quot;/&gt;
        &lt;/console&gt;

        &lt;File name=&quot;log&quot; fileName=&quot;${log.path}/test.log&quot; append=&quot;false&quot;&gt;
            &lt;PatternLayout pattern=&quot;[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n&quot;/&gt;
        &lt;/File&gt;

        &lt;RollingFile name=&quot;RollingFileInfo&quot; fileName=&quot;${log.path}/info.log&quot;

        filePattern=&quot;${log.path}/logs/${date:yyyy-MM}/info-%d{yyyy-MM-dd}.log.zip&quot;&gt;

            &lt;!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--&gt;
            &lt;ThresholdFilter level=&quot;info&quot; onMatch=&quot;ACCEPT&quot; onMismatch=&quot;DENY&quot;/&gt;

            &lt;PatternLayout pattern=&quot;[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n&quot;/&gt;

            &lt;Policies&gt;
                &lt;TimeBasedTriggeringPolicy modulate=&quot;true&quot; interval=&quot;1&quot;/&gt;
            &lt;/Policies&gt;

        &lt;/RollingFile&gt;
    &lt;/appenders&gt;

    &lt;!--然后定义logger,只有定义了logger并引入appender,appender才会生效--&gt;
    &lt;loggers&gt;

        &lt;!--过滤掉spring和mybatis的一些无用的DEBUG信息--&gt;
        &lt;logger name=&quot;org.springframework&quot; level=&quot;INFO&quot;/&gt;
        &lt;logger name=&quot;org.mybatis&quot; level=&quot;INFO&quot;/&gt;
        &lt;logger name=&quot;com.baiding&quot; level=&quot;INFO&quot;/&gt;

        &lt;root level=&quot;info&quot;&gt;
            &lt;appender-ref ref=&quot;Console&quot;/&gt;
            &lt;appender-ref ref=&quot;RollingFileInfo&quot;/&gt;
        &lt;/root&gt;

    &lt;/loggers&gt;

&lt;/configuration&gt;

1. 根节点属性

根节点Configuration有两个属性,status和monitorinterval

status : status用来指定log4j2本身的日志的级别

monitorinterval : monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s

2. Properties 标签

在xml文件中,可以使用Properties 标签来自定义变量,方便其他地方的引用。

&lt;Properties&gt;
    &lt;Property name=&quot;log.path&quot;&gt;log&lt;/Property&gt;
&lt;/Properties&gt;

这里的log.path是定义日志存放的地方,此处是存放于项目根路径下的log文件夹中

3. appenders节点

和logback一样,Appender是用来定义日志输出点的,一般常用有三个子节点,分别为Console、RollingFile、File。

(1) Console节点用来定义输出到控制台的Appender

name : 指定Appender的名字,用于Logger节点引用

target : SYSTEM_OUT 或 SYSTEM_ERR,一般设置为:SYSTEM_OUT

PatternLayout : 指定日志输出格式,默认为%m%n

&lt;console name=&quot;Console&quot; target=&quot;SYSTEM_OUT&quot;&gt;
    &lt;!--输出日志的格式--&gt;
    &lt;PatternLayout pattern=&quot;[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n&quot;/&gt;
&lt;/console&gt;

(2) File节点用来定义输出到指定位置的文件的Appender

name : 指定Appender的名字,用于Logger节点引用

fileName : 指定输出日志的目的文件带全路径的文件名

append : 是否追加,默认为ture。ture是将新日志追加到原日志文件尾部,false则是删除已有文件,重建新文件

PatternLayout : 指定日志输出格式,默认为%m%n

&lt;File name=&quot;log&quot; fileName=&quot;log/test.log&quot; append=&quot;false&quot;&gt;
    &lt;PatternLayout pattern=&quot;[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n&quot;/&gt;
&lt;/File&gt;

(3) RollingFile节点用来定义输出到指定位置的文件的Appender,但其记录的内容可拆分

File对文件的约束很简单,而RollingFile则比较灵活,其可根据文件大小来分拆,还可以根据时间来分拆。

name : 指定Appender的名字,用于Logger节点引用

fileName : 指定输出日志的目的文件带全路径的文件名

filePattern:指定拆分出去的日志文件的全路径的文件名以及格式

PatternLayout : 指定日志输出格式,默认为%m%n

Policies : 指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.

TimeBasedTriggeringPolicy : 基于时间进行日志的滚动

SizeBasedTriggeringPolicy : 基于文件大小进行日志的滚动

ThresholdFilter : 日志过滤器

&lt;RollingFile name=&quot;RollingFileInfo&quot; fileName=&quot;${log.path}/info.log&quot;
       filePattern=&quot;${log.path}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.zip&quot;&gt;

    &lt;!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--&gt;
    &lt;ThresholdFilter level=&quot;info&quot; onMatch=&quot;ACCEPT&quot; onMismatch=&quot;DENY&quot;/&gt;

    &lt;PatternLayout pattern=&quot;[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n&quot;/&gt;

    &lt;Policies&gt;
        &lt;TimeBasedTriggeringPolicy modulate=&quot;true&quot; interval=&quot;1&quot;/&gt;
    &lt;/Policies&gt;

&lt;/RollingFile&gt;

这里说一下TimeBasedTriggeringPolicy这个滚动策略的属性interval,它是指日志进行滚动的间隔,那么它的单位具体是什么呢?关键点在于filePattern的日志文件名所含有的日期格式%d{yyyy-MM-dd},这里日期格式具体到了天,那么以天为单位,若是日期具体到%d{yyyy-MM-dd-HH-mm}分钟的话,那么就是以分钟为单位。
这里还提到了日志过滤器,Log4j提供了许多的日志过滤器,但我们一般采用ThresholdFilter,这个过滤器一般用来过滤掉所有级别低于它定义的级别的日志。

4. loggers

Loggers节点下一般有root和logger节点。

root节点用来指定项目的根日志,如果没有单独指定logger,那么就会默认使用该root日志输出。

level :日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

appender-ref :root的子节点,用来指定该日志输出到哪个Appender

&lt;root level=&quot;info&quot;&gt;
    &lt;appender-ref ref=&quot;Console&quot;/&gt;
    &lt;appender-ref ref=&quot;RollingFileInfo&quot;/&gt;
&lt;/root&gt;

logger节点用来单独指定日志的形式,比如要为某个包下所有的class或者某个具体的class指定不同的日志级别等。

level : 日志输出级别

name : 用来指定该Logger所适用的类或者包.

AppenderRef :Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root

additivity :是否向上级传递日志 true(默认)或false

&lt;!--过滤掉spring和mybatis的一些无用的DEBUG信息--&gt;
&lt;logger name=&quot;org.springframework&quot; level=&quot;INFO&quot;/&gt;
&lt;logger name=&quot;org.mybatis&quot; level=&quot;INFO&quot;/&gt;
&lt;logger name=&quot;com.baiding&quot; level=&quot;INFO&quot;/&gt;

若我们为logger指定了AppenderRef ,别忘了将logger的additivity 属性设置为false,要不然日志可能会在指定的Appender中输出两遍。

5. Log4j2异步输出日志

Log4j2有个突出的功能就是支持高效低延迟的异步化写日志。日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影响。

日志的异步输出使用了disruptor这个开源的并发框架,所以首先得导入disruptor.jar包

&lt;dependency&gt;
    &lt;groupId&gt;com.lmax&lt;/groupId&gt;
    &lt;artifactId&gt;disruptor&lt;/artifactId&gt;
    &lt;version&gt;3.4.2&lt;/version&gt;
&lt;/dependency&gt;

异步输出分为两种情况,一种为全异步模式,一种为异步和非异步混合输出模式。通过官方的性能对比,一般线程数在2-16之间的话,混合使用同步和异步的logger来打印日志,性能是最好的。这种模式的启用,主要在于两个节点的使用,分别为AsyncRoot和AsyncLogger,这两个节点可以和Root 或 Logger节点混合使用。

修改一下上述的log4j2.xml文件中loggers节点就可以了:

&lt;loggers&gt;
    &lt;asyncRoot level=&quot;info&quot;&gt;
        &lt;appender-ref ref=&quot;Console&quot;/&gt;
        &lt;appender-ref ref=&quot;RollingFileInfo&quot;/&gt;
    &lt;/asyncRoot &gt;
    &lt;asyncRoot name=&quot;com.baiding&quot; level=&quot;INFO&quot; /&gt;
    &lt;asyncRoot name=&quot;org.mybatis&quot; level=&quot;INFO&quot; /&gt;
    &lt;asyncRoot name=&quot;org.springframework&quot; level=&quot;INFO&quot; /&gt;
&lt;/loggers&gt;

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。