logback配置说明

 

 

logback配置详解

官方文档 http://logback.qos.ch/manual/

1. 根节点 - configuration

一共有三个属性

  • debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

  • scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。

  • scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。

1.1 configuration - appender

指定日志输出格式,输出位置,相当于一个出口

2个主要属性

  • name name指定appender名称

  • class class指定appender的全限定名

1.1.1 configuration - appender - encoder

encoder负责将事件转换为字节数组,并将该字节数组写入OutputStream。可以设置日志输出格式。

    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> 
        <encoder>
            <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder> 
    </appender>
1.1.2 configuration - appender - filter

对日志进行过滤,常用的2中

  • ch.qos.logback.classic.filter.ThresholdFilter 指定最低日志级别,高于等于设定级别的日志都会被输出
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> 
        <!-- 高于debug的日志都会被输出 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>
  • ch.qos.logback.classic.filter.LevelFilter LevelFilter基于精确的级别匹配过滤事件。如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,这取决于onMatch和onMisMatch属性的配置。
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <!-- 只输出INFO级别日志 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
</appender>
1.1.3 configuration - appender - append

追加日志还是覆盖日志

    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <file>${basePath}self.log</file>
        <!-- 默认append=true,即可追加而非覆盖 -->
        <append>true</append>
        <encoder> 
            <pattern>${pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- prudent=true表示日志写入线程安全,会降低效率,默认为false -->
        <prudent>false</prudent>
    </appender>
1.1.4 configuration - appender - prudent

prudent=true表示日志写入线程安全,会降低效率,默认为false

配置如上

1.1.5 configuration - appender 输出到Console
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> 
        <encoder>
            <pattern>${pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>
1.1.6 configuration - appender 输出到文件
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <file>${basePath}self.log</file>
        <!-- 默认append=true,即可追加而非覆盖 -->
        <append>true</append>
        <encoder> 
            <pattern>${pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- prudent=true表示日志写入线程安全,会降低效率,默认为false -->
        <prudent>false</prudent>
    </appender>
1.1.7 configuration - appender 输出到滚动文件
滚动策略。具体策略由class指定。

TimeBasedRollingPolicy是最常用的滚动策略,根据时间滚动,当达到一定时间时,自动重新开辟一个日志文件

FixedWindowRollingPolicy根据固定窗口算法重命名文件的滚动策略

triggeringPolicy根据当前活动文件大小来决定是否滚动的策略

SizeAndTimeBasedRollingPolicy同时根据日期和文件大小的滚动测策略

<appender name="timeFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
   
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 由于表达式中最小单位为天,所以每天生成一个日志文件,且以此命名 -->
            <fileNamePattern>${basePath}RollingFile%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 保留归档文件的最大数量。 -->
            <!-- 本例中由于使用了时间作为滚动策略,且fileNamePattern中最小单位为天,所以归档文件保存30天,超过30天将被删除 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <!-- 根据固定窗口模式生成日志文件,结合triggeringPolicy(当日志文件达到5MB时触发滚动,生成新的日志文件) -->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <!-- 日志文件命名,%i代表从minIndex到maxIndex,即 fixedFile1.log.zip fixedFile2.log.zip
            fixedFile3.log.zip -->
            <!-- 当生成了3个归档文件后,若继续生成,将覆盖最早的日志 -->
            <fileNamePattern>${basePath}fixedFile%i.log.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <!-- maxIndex若过大,会被设为12 -->
            <maxIndex>3</maxIndex>
        </rollingPolicy>

        <!-- 触发策略,达到一定条件时将通知appender,触发滚动 -->
        <triggeringPolicy
                class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>

        <!-- 同时根据时间和日期生成文件,单日文件大小超过指定会在生成一个文件 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>${pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
1.2 configuration - logger

logger是代码中获取用于输出的对象

3个主要属性

  • name name属性可指定为包名或类名

  • level 声明输出级别

  • additivity 表示是否向父级logger传递打印消息,默认为true

1.2.1 确定父子级别

以name属性为判断标准,同java类的包关系。

如下2个logger,第一个就是第二个的父级

<logger name="a.b" level="debug">
</logger>
<logger name="a.b.c" level="debug">
</logger>
1.2.2 输出级别的判定

若子logger没有指定level,则向父级找,以最近的一个父级的level为准,root节点是最高级,默认level是debug

如下3个logger,第二个logger的level就是info

<logger name="a" level="info">
</logger>
<logger name="a.b">
</logger>
<logger name="a.b.c" level="debug">
</logger>
1.2.3 是否向父级追加

当 additivity = true 时,子logger输出一遍,父级还会输出一遍

如下3个logger, 获取 logger = LoggerFactory.getLogger("a.b.c"),当用logger打印一个日志时,第三个会输出一次,第二个也会输出一次

<logger name="a" level="info">
</logger>
<logger name="a.b" additivity="false">
</logger>
<logger name="a.b.c" level="debug">
</logger>
1.2.4 设置输出appender

appender-ref指定输出位置,可以有0个或多个,0个就是没有输出位置,多个就是输出到多个位置

<logger name="a" level="info">
    <appender-ref ref="stdout"/>
</logger>
<logger name="a.b" additivity="false">
</logger> 
1.3 configuration - root

根logger,只需要指定一个 level

1.4 在logback的配置文件里获取application.yml中的属性
<springProperty name="basePath" source="log.path"/>

要想用这个标签,配置文件名不能命名为 logback.xml 或 logback-test.xml,因为那样这个配置文件就会在spring加载前加载,就找不到 application.yml中的参数

2 常用配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- 默认为 <configuration scan="true" scanPeriod="60 seconds" debug="false"> -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false -->
<configuration>
    <contextName>myAppName</contextName>
    <springProperty name="basePath" source="log.path" defaultValue=""/>

    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <property name="file_pattern"
              value="%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n"/>
    <property name="console_pattern"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!-- appender是指输出的形式或位置,name和class是两个必备属性 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoder负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。 -->
        <encoder>
            <pattern>${console_pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>


    <!-- Log file debug output -->
    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${basePath}/debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${basePath}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${file_pattern}</pattern>
        </encoder>
    </appender>

    <!-- Log file info output -->
    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${basePath}/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${basePath}/%d{yyyy-MM, aux}/info.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${file_pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!-- Log file error output -->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${basePath}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${basePath}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${file_pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>



    <root level="debug">
        <appender-ref ref="stdout"/>
        <appender-ref ref="debug"/>
        <appender-ref ref="info"/>
        <appender-ref ref="error"/>
    </root>
</configuration>

本文使用 mdnice 排版

posted @ 2020-07-13 13:41  A_yes  阅读(1000)  评论(0编辑  收藏  举报