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

it2023-11-28  85

前言

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

最新回复(0)