前言
之前有写到一个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中配置好的应用名称,所以就会打印出一个奇怪名字的日志文件夹名字了