• SpringCloud Logback日志配置


    转自:https://www.jianshu.com/p/c889b8431b06

    springboot logback的源码分析请参考这篇,讲的很好:https://juejin.im/post/5cd0cdcc6fb9a0323120a3f4

    一、日志常规配置

    直接贴出logback-spring.xml,基本满足了对日志的常规需求:
    1、控制台日志(带颜色显示)
    2、全部日志文件(包括全别日志级别的日志,每天一个,自动压缩)
    3、错误日志文件(仅抽取ERROR级别日志,每天一个,自动压缩)

    说明:
    a. 日志存放目录需要在application.yml中配置: logging: path: /data/logs/${spring.application.name}
    b. 此配置文件可以自行扩展,比如增加elk输出、调整日志级别、增加日志过滤等。不在本文讨论访问内。

    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <!-- 参考SpringBoot默认的logback配置,增加了error日志文件 -->
        <!-- org/springframework/boot/logging/logback/base.xml  -->
    
        <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="LOG_PATH" value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}"/>
        <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-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}}"/>
        <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    
        <!-- 控制台日志 -->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            </encoder>
        </appender>
    
        <!-- 全量日志 -->
        <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder>
                <pattern>${FILE_LOG_PATTERN}</pattern>
            </encoder>
            <file>${LOG_PATH}/all.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_PATH}/all.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
                <maxFileSize>${LOG_FILE_MAX_SIZE:-50MB}</maxFileSize>
                <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
            </rollingPolicy>
        </appender>
    
        <!-- 错误日志 -->
        <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder>
                <pattern>${FILE_LOG_PATTERN}</pattern>
            </encoder>
            <file>${LOG_PATH}/err.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_PATH}/err.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
                <maxFileSize>${LOG_FILE_MAX_SIZE:-50MB}</maxFileSize>
                <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
            </rollingPolicy>
            <!-- 过滤出ERROR级别的日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!-- 日志总开关 -->
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE_ALL" />
            <appender-ref ref="FILE_ERROR" />
        </root>
    
        <!-- 日志过滤 -->
        <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
        <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
        <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
        <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
        <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
        <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
        <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
    </configuration>
    

    二、引入sleuth zipkin是怎么输出traceId的?

    一直有个疑问,为什么引入sleuth+zipkin之后,日志中会输出traceId和spanId:

    2019-06-11 16:16:00.117  INFO [test-project,29ce39ac8a54f753,29ce39ac8a54f753,false] 1636 --- [http-nio-12001-exec-2] ...
    2019-06-11 16:16:00.332  INFO [test-project,29ce39ac8a54f753,29ce39ac8a54f753,false] 1636 --- [http-nio-12001-exec-2] ...
    

    从上面logback的配置文件FILE_LOG_PATTERN并未发现相关配置,其中必有妖怪!
    通过分析引入的sleuth依赖,终于发现在spring-cloud-sleuth-core-xxx.jar找到,请看这个类

    org.springframework.cloud.sleuth.autoconfig.TraceEnvironmentPostProcessor
    
        

    这段代码在项目启动阶段,把环境变量logging.pattern.level替换了,增加了spring.application.nameX-B3-TraceIdX-B3-SpanId。实际上就是替换了环境变量LOG_LEVEL_PATTERN,再回到logback的配置文件FILE_LOG_PATTERN

    ${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}
    

    其中${LOG_LEVEL_PATTERN:-%5p}就是引用了这个环境变量。

    到此为止,是不是就完了呢?No~~!增加的spring.application.nameX-B3-TraceIdX-B3-SpanId的值从哪里来呢?继续看代码

    org.springframework.cloud.sleuth.log.Slf4jCurrentTraceContext
    

    这个类中通过MDC ( Mapped Diagnostic Contexts )的方式把traceId、spanId插入到日志内容中。



    作者:假程序猿
    链接:https://www.jianshu.com/p/c889b8431b06
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    集群
    监控流量脚本
    三次握手四次挥手的原理
    Nginx虚拟主机配置
    apche基于域名,ip,端口的配置
    LVS+Keepalived搭建MyCAT高可用负载均衡集群
    Codeforces 553E Kyoya and Train
    Codeforces 632E Thief in a Shop
    【BZOJ4259】残缺的字符串
    【BZOJ3160】万径人踪灭
  • 原文地址:https://www.cnblogs.com/sharpest/p/13705124.html
Copyright © 2020-2023  润新知