企业级日志配置之Logback

460 阅读2分钟

Logback简介

Logback 继承自 log4j。

Logback 的架构非常的通用,适用不同的使用场景。Logback 被分成三个不同的模块:logback-core,logback-classic,logback-access。

logback-core 是其它两个模块的基础。logback-classic 模块可以看作是 log4j 的一个优化版本,它天然的支持 SLF4J,所以你可以随意的从其它日志框架(例如:log4j 或者 java.util.logging)切回到 logack。

logback-access 可以与 Servlet 容器进行整合,例如:Tomcat、Jetty。它提供了 http 访问日志的功能。

Logback的Appender

logback 将写入日志事件的任务委托给一个名为 appender 的组件。所以appender代表日志任务,理所当然我们的INFO、ERROR、DEBUG等日志输出在appender里边定义。

基于xml配置Appender

<configuration>
    //这里涉及到name和class两个属性,name是该日志任务的名字,可以随便起,需要和下边的root标签appender-ref对应。
    //class是一个比较重要的属性,根据不同的日志level配置不同的class
    //例子:控制台输出的对应class:ch.qos.logback.core.ConsoleAppender
    //debug、error、warn对应class:ch.qos.logback.core.rolling.RollingFileAppender
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender" >
        <!-- encoder 默认使用 ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>    
    </appender>

    <root level="info">
        <appender-ref ref="console" />
    </root>
</configuration>

Rolling policy 简介

Rolling policy 负责轮转的方式,按照时间和文件大小轮转需要用到Rolling policy。

基于xml配置Rolling policy

<configuration debug="true">
    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>mylog.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
	    //日志名称,按天轮转 
            <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            //保存时间60天,60天之后自动清除以前日志
            <maxHistory>60</maxHistory>
            //限制归档文件总的大小
            <totalSizeCap>20GB</totalSizeCap>
            //检测者,mylog.log文件大小到达100MB,执行上边的策略
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            //文件大小100MB,满了之后自动创建文件存储这些日志
            <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>

        </rollingPolicy>

        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="debug" />
    </root>
</configuration>

Logback的Encoder

encoder 负责将日志事件转换为字节数组,并将字节数组写入到合适的 OutputStream 中。所以encoder负责日志输出的

基于xml配置Encoder

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
  <file>foo.log</file>
  <encoder>
    //日志输出的格式
    <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
    //默认文件尾部追加日志,开启文件头部追加日志
    <outputPatternAsHeader>true</outputPatternAsHeader>
  </encoder> 
</appender>

Logback的logger和root节点搭配使用

encoder 负责将日志事件转换为字节数组,并将字节数组写入到合适的 OutputStream 中。所以encoder负责日志输出的

基于xml配置logger和root

//logger标签 additivity默认为true会向上传递日志,name表示监控的包,触发日志时间上传root,调用appender-ref的日志任务
 <logger name="org.springframework" level="debug"  additivity="false">
 		<appender-ref ref="debug"/>
 </logger>
    <logger name="com.lzy.logdemo" level="debug"/>
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="debug"/>
    </root>

logback.xml的整体配置

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="10 seconds" debug="false">
    <!-- set env -->
    <property name="LOGDROOT" value="${user.home}"/><!--电脑User用户目录-->
    <property name="APP_NAME" value="XM"/><!--项目名称-->
    <!--日志路径-->
    <property name="DEBUG_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_debug"/>
    <property name="INFO_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_info"/>
    <property name="WARN_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_warn"/>
    <property name="ERROR_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_error"/>
    <property name="DAY_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}"/>
     <!--日志输出格式-->  
    <property name="LOG_PATTERN_CONSOLE"
              value="[%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c:%L] [%thread] [%X{traceId}] %m%n"/>
    <property name="LOG_PATTERN_FILE"
              value="[%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c:%L] [%thread] [%X{traceId}] %m%n"/>
    <property name="CALC_BILL_LOG_PATTERN_FILE" value="%m%n"/>
    <!--可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,删除之前的旧文件-->
    <property name="MAXHISTORY" value="30"/>
    <!--设置日志存储最大值-->
    <property name="MAXFILESIZE" value="500MB"/>
 
    <!-- 性能相关 -->
    <property name="PERF_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_perf"/>
 
    <!-- set context name -->
    <contextName>${APP_NAME}</contextName>
 
    <!-- console -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="UTF-8">
            <pattern>${LOG_PATTERN_CONSOLE}</pattern>
        </encoder>
    </appender>
 
    <!-- debug level -->
    <appender name="debug"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- file name -->
        <File>${DEBUG_LOG_PATH}.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--output file name -->
            <fileNamePattern>${DEBUG_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <!-- MAXHISTORY days old files will be delete -->
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${MAXFILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>${LOG_PATTERN_FILE}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
    <!-- info level -->
    <appender name="info"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${INFO_LOG_PATH}.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${INFO_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${MAXFILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>${LOG_PATTERN_FILE}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
    <!-- warn level -->
    <appender name="warn"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${WARN_LOG_PATH}.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${WARN_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${MAXFILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>${LOG_PATTERN_FILE}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
    <!-- error level -->
    <appender name="error"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${ERROR_LOG_PATH}.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ERROR_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${MAXFILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>${LOG_PATTERN_FILE}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 
    <!-- 每日输出 -->
    <appender name="day_log"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${DAY_LOG_PATH}.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${DAY_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${MAXFILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>${LOG_PATTERN_FILE}</pattern>
        </encoder>
    </appender>
 
    <!-- 异步输出 -->
    <appender name="dayLogAsyncAppender" class="ch.qos.logback.classic.AsyncAppender">
        <includeCallerData>true</includeCallerData>
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <appender-ref ref="day_log"/>
    </appender>
 
    <!-- spring -->
    <logger name="org.springframework" level="info"/>
 
    <logger name="com.dome" level="info" additivity="false">
        <appender-ref ref="error"/>
        <appender-ref ref="warn"/>
        <appender-ref ref="console"/>
    </logger>
 
    <!-- lookback -->
    <logger name="lookbackLogger" level="info" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="lookbackAppender"/>
    </logger>
    <!-- root -->
    <root level="info">
        <appender-ref ref="info"/>
        <appender-ref ref="warn"/>
        <appender-ref ref="error"/>
        <appender-ref ref="console"/>
    </root>
</configuration>

参考链接:blog.csdn.net/c880420/art…