spring cloud脚手架项目(十一)logback配置

前言

之前有写到一个aop日志输出,当时没有做好相关的logback配置。前几个月在新公司给老系统升级的时候重写了一个好用的aop的logback的配置。对于spring boot 的logback配置的xml文件也有了很好的理解。这次接机说明一下。也为下一篇文章讲到链路之间的日志uuid的添加做准备

代码

以下就是详细的xml配置文件。每一行我都做了对应的注释和说明

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!--spring boot原生默认配置,用到了default file 输入格式   -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!--spring boot原生控制台配置,需要引入default才可以    -->
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <!--log文件格式中添加%contextName可以获得这个值,参照history第一次提交-->
    <contextName>logback</contextName>
    <!--log文件的默认文件夹的名称和位置,获得的参数为yml中的spring.application.name -->
    <springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
    <property name="log.path" value="${spring.application.name}-log" />
    <!--日志存放时间 该配置下为3天-->
    <property name="maxHistory" value="2" />
    <!--日志分割大小为一个文件,该配置下为10MB进行分割-->
    <property name="maxFileSize" value="10MB" />
    <!-- 普通日志格式 [%X{TRACE_ID}]以及[%X{HEAD_ID}] 如果没有看我的其他文章,可以去掉-->
    <property name="FILE_LOG_PATTERN" value="[%X{HEAD_ID}][%X{TRACE_ID}][%d{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger{40}]:%msg%n"/>
    <!--输出到debug-->
    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}-log/debug-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印DEBUG日志 -->
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--输出到info-->
    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志最大保存3天,并且每个日志格式最大大小设置,举例格式为2020-10-20-log/info-0.log -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}-log/info-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <!--日志追加到结尾-->
        <append>true</append>
        <!--对记录事件进行格式化-->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!--输出到warn-->
    <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}-log/warn-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>
    <!--输出到error-->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}-log/error-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印ERROR日志 -->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--输出到other-->
    <appender name="other" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}-log/other-%i.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
            <maxFileSize>${maxFileSize}</maxFileSize>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>
    <!-- 不同的业务逻辑日志打印到指定文件夹 additivity用于处理是否在其他日志战士,false不展示
    这个类是我的内部类,你的话如果要用就是用自己的内部类,或者去掉other和这个-->
    <logger name="com.chen.common.logAop.ParamsLogAspect" additivity="true" level="INFO">
        <appender-ref ref="other"/>
    </logger>
    <!-- 测试环境+开发环境. 多个使用逗号隔开. -->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="debug"/>
            <appender-ref ref="info"/>
            <appender-ref ref="warn"/>
            <appender-ref ref="error"/>
        </root>
    </springProfile>
    <!-- 生产环境. -->
    <springProfile name="prd,stg">
        <root level="INFO">
            <appender-ref ref="info"/>
            <appender-ref ref="warn"/>
            <appender-ref ref="error"/>
        </root>
    </springProfile>
</configuration>

说明

这次的logback的配置中。我开始是使用了自己的配置。但是其实你如果什么都不做设置的话。spring boot启动的时候也会有一个默认的配置。那么其实你的很多配置都可以直接参考,甚至直接引用。

像我的这个配置中。控制台输出的内容我是直接使用spring boot的默认配置的。如下图:
在这里插入图片描述
我就是直接引用了
org/springframework/boot/logging/logback/defaults.xml
org/springframework/boot/logging/logback/console-appender.xml

而且对应的日志格式中的内容也是基本复制的默认控制台的配置,做出了稍微一点点的微调

[%X{TRACE_ID}]以及[%X{HEAD_ID}] 这2个参数是用做不同微服务之间的日志链路传递使用的。在我的后几篇文章中会提到。如果有影响了可以直接去掉即可

输出到other这部分的日志是我用做aop日志格式输出使用的。可以单独答应接口的aop日志。有利于我平时看日志的

遇到的问题

logback打印出奇怪的日志文件夹名称,如图所示,上一个红框中是正确的,下一个红框中是错误的。只有文件夹名称不对,其他都对
在这里插入图片描述

解决办法

如果之前没有添加bootstrap.yml,需要添加这个。
其中的spring.application.name这个参数需要和其他yml中的参数保持一致。这样才不会遇到我注释用的那个问题。

#spring boot logback问题,启动的时候如果spring.application.name 名字和application.yml中不一致的话,
#会导致产生2个日志文件,第一个是空的,第二个才是有的。用配置的方法解决。要保持一致
spring:
  application:
    name: SERVICE-A

问题原因

这个问题的原因是在spring boot启动的时候logback要先于spring boot yml去获得一些配置。用来以防止spring boot早起启动发生问题的时候可以打印出错误信息。如果没有配置bootstrap.yml,他就获得不到我在yml中配置好的应用名称,所以就会打印出一个奇怪名字的日志文件夹名字了

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页