LogBack配置

473

LogBack介绍

Logback是由log4j创始人设计的另一个开源日志组件。目前主要有以下三个组件

  • logback-core:基础模块
  • logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
  • logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
    官方网站

配置介绍

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"></timestamp>
    <!-- 定义常量属性 -->
    <property name="name" value="recommend_web"></property>
    <property name="CONSOLE_LOG_PATTERN" value="%-4relative [%thread] %-5level %logger{35} - %msg %n"></property>
    <!-- 配置上下文名称 -->
    <contextName>${name}</contextName>
    <!-- 输出到控制台 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 格式化日志内容 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern></pattern>
        </encoder>
    </appender>
    <!-- 把日志添加到文件 -->
    <appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
        <!-- 被写入的文件名,可以是相对目录,也可以是绝对目录,没有默认值 -->
        <file>F:\logs\test.log</file>
        <!-- true-日志追加到文件结尾,false-清空现存文件,默认为true -->
        <append>true</append>
        <!-- 对日志内容格式化 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
        <!-- true-日志安全的写入文件,效率低,默认为false -->
        <prudent>false</prudent>
    </appender>
    <!-- 滚动记录文件 -->
    <appender name="rollingAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>F:\rollLog\logFile.log</file>
        <!--
        TimeBasedRollingPolicy</font>:根据时间制定滚动策略
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 归档文件格式 -->
            <fileNamePattern>
                logFile.%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <!-- 归档文件最大数量 -->
            <maxHistory>30</maxHistory>
            <!-- 设置大小,跟TimeBasedRollingPolicy搭配使用,表示按日期、文件大小记录日志,文件名引用%i表示索引 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!--
        SizeBasedTriggeringPolicy:根据文件制定滚动策略
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <!-- 活动文件大小,如果超过当前大小,则触发滚动,默认为10MB -->
            <maxFileSize>5MB</maxFileSize>
        </rollingPolicy>
        <!--
        FixedWindowRollingPolicy:根据固定窗口算法制定滚动策略
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <!-- 活动文件大小,如果超过当前大小,则触发滚动,默认为10MB -->
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
            <!-- 归档文件格式,必须包含%i,表示当前文件索引 -->
            <fileNamePattern>
                logFile.%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <!-- 告知 RollingFileAppender 何时激活滚动,跟FixedWindowRollingPolicy搭配使用 -->
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
                <maxFileSize>5MB</maxFileSize> 
            </triggeringPolicy>
        </rollingPolicy>
        
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
        <!-- 级别过滤器,根据日志级别进行过滤 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 设置过滤级别 -->
            <level>ERROR</level>
            <!-- 用于配置符合过滤条件的操作 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 用于配置不符合过滤条件的操作 -->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 临界值过滤器,过滤掉低于指定临界值的日志 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 设置过滤级别 -->
            <level>ERROR</level>
        </filter>
    </appender>
    <!-- 定义日志文件异步输出 -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="rollingAppender"/>
    </appender>
    <!-- 
        用来设置某一个包或具体某一个类的日志打印级别,可以有多个logger配置 
        level:指定级别,不写则继承上级的级别
        addtivity:是否向上级logger传递打印信息,默认为true
    -->
    <logger name="com.log.controller.LogController" level="INFO" addtivity="false">
        <!-- 输出源,可以有多个,引用appender标签的name -->
        <appender-ref ref="fileAppender"/>
    </logger>
    <!-- logger根元素,是所有logger元素的上级,只有一个level属性,默认为DEBUG -->
    <root level="INFO">
        <appender-ref ref="consoleAppender"/>
    </root>
</configuration>

Logback输出日志是从子节点开始,子节点如果有输出源直接输出,如果无,判断配置的addtivity,是否像上级传递,即是否向root传递,传递则采用root的输出源,否则不输出日志。
如果logger采用root的输出源,则跟root的level无关,比如:logger的level为INFO,root的level为ERROR,如果日志打印为info级别日志,也一样会打印出来,向上级传递只是使用root节点的输出源。
如果同时配置了日志文件和配置文件的级别,那么以配置文件application.yml中的级别为主

springboot下logback配置

官方推荐使用的xml名字的格式为:logback-spring.xml而不是logback.xml,至于为什么,因为带spring后缀的在配置加载完成以后才加载,这样便可以读取配置文件中的属性,所以可以使用<springProfile>这个标签。而logback.xml加载过早,读取不到属性。通过springProfile标签,可以让日志在不同的环境下打印不同的日志。比如可以通过包裹logger和root标签,示例如下:
<!-- name表示当前的环境,可以配置多个,比如test-测试 prod-生产 -->
<springProfile name="dev">
    <logger name="com.log.controller.LogController" level="INFO" addtivity="false">
        <appender-ref ref="fileAppender"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="consoleAppender"/>
    </root>
<springProfile>