SpringBoot集成Logback遇到的问题
https://zhuanlan.zhihu.com/p/540737614
解决log4j和self4j日志报错Could NOT find resource [logback.groovy]及Could NOT find resource [logback-test.xml]问题
https://blog.51cto.com/u_15009374/3148829
____________________________________________________________________________________________________________________________________
目录 收起 一、如何集成logback到SpringBoot项目 二、集成logback到SpringBoot项目遇到的问题 三、总结一下 历史文章欢迎大家点点关注,可以最先收到定期更新的 SpringBoot 以及 Java 编程相关知识文章。
最近在写日志的一些处理,需要涉及到logback,遇到了一些问题,下面我把我集成logback的过程以及遇到的问题逐步写出来。
一、如何集成logback到SpringBoot项目
实际上SpringBoot项目如果咱们使用starter的话,默认是已经集成了。
如果需要单独引用不同的版本,可以单独引入maven包。
<!-- 导入logback日志的jar -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
如果不修改输出日志格式,默认即可,如果需要自己改造日志格式,则需要在resources文件夹中增加logback-spring.xml并修改。
因为咱们是使用的SpringBoot项目,因此使用logback-spring.xml,后面问题中有这个的坑,咱们在问题中再说。
logback-spring.xml文件,这里面配置了三个输出,分别是STDOUT(控制台输出格式),ERROR(错误日志文件输出),FILE(日志文件输出),其中pattern表示具体显示的格式,另外更高级的可以自定义增加变量,比如一些openId输出的日志中,具体格式我注释在了代码中,[%X{openId}]。如果要对日志做一些处理,可以增加配置converterClass,这个类需要继承extends MessageConverter。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<conversionRule conversionWord="msg" converterClass="cn.xuesong.LogMaskConverter" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{openId}] [%level] [%thread] [%c] - %msg%n</pattern> -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%c] - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/xuesong.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_PATH}/xuesong.%d{yyyy-MM-dd}.log.gz</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%c] - %msg%n</pattern>
</encoder>
</appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/xuesong.%d{yyyy-MM-dd}.error</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%c] - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT"/>
<appender-ref ref="ERROR" />
</root>
</configuration>
有了以上两个配置之后,应该就ok了,但我自己遇到了一些问题,下面该进入我自己遇到的问题了。
二、集成logback到SpringBoot项目遇到的问题
- logback-spring.xml文件失效
我在SpringBoot启动类所在的module中资源文件夹resources中增加了logback-spring.xml之后,无论如何都不按照我的格式输出。
然后我把logback-spring.xml名字修改成logback.xml发现好用了(但仍然报错),通过idea快捷键(此处有坑)搜索找不到另外一个logback.xml,纳闷了半天,怎么回事。
通过手工查找,发现某个子module包含了logback.xml这个文件,最终发现,我是通过idea的快捷键(Find in Path)查找的,这个不是搜索文件的,而是搜索文件中的内容文字的。。。。。感觉被扇了一记响亮的耳光,需要通过Navigate File的快捷键搜索文件名字,我错了,用了这么久idea发现用错了,真打脸
2. logback.xml文件的日志输出处理类报错
然后我把我上面的logback-spring.xml中的内容整个复制到了我找到的这个logback.xml之后,启动服务,日志是能够按照我的格式输出了,但是最初的几行日志抱错,具体如下
17:27:04,400 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
17:27:04,401 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
17:27:04,402 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:********/target/classes/logback.xml]
17:27:04,554 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
17:27:04,555 |-INFO in ch.qos.logback.core.joran.action.ConversionRuleAction - registering conversion word msg with class [cn.xuesong.LogMaskConverter]
17:27:04,555 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
17:27:04,566 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
17:27:04,603 |-ERROR in ch.qos.logback.core.pattern.parser.Compiler@68bbe345 - Failed to instantiate converter class [cn.xuesong.LogMaskConverter] for keyword [msg] ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type cn.xuesong.LogMaskConverter
at ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type cn.xuesong.LogMaskConverter
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:69)
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassName(OptionHelper.java:45)
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassName(OptionHelper.java:34)
at at ch.qos.logback.core.pattern.parser.Compiler.createConverter(Compiler.java:104)
at at ch.qos.logback.core.pattern.parser.Compiler.compile(Compiler.java:63)
at at ch.qos.logback.core.pattern.parser.Parser.compile(Parser.java:87)
at at ch.qos.logback.core.pattern.PatternLayoutBase.start(PatternLayoutBase.java:84)
at at ch.qos.logback.classic.encoder.PatternLayoutEncoder.start(PatternLayoutEncoder.java:28)
at at ch.qos.logback.core.joran.action.NestedComplexPropertyIA.end(NestedComplexPropertyIA.java:161)
at at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
at at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
at at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
at at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
我开始怀疑了,啥原因?然后试着去掉我增加的内容,就不报错了,怎么回事呢?
<conversionRule conversionWord="msg" converterClass="cn.xuesong.LogMaskConverter" />
加上就报错,删掉不报错,后来仔细思考了下,是因为logback.xml和logback-spring.xml的原因。
咱们先说说logback.xml和logback-spring.xml,logback.xml是logback默认的输出文件,启动早于SpringBoot,因此是没有springbean注入的,而我的LogMaskConverter,是使用了spring的一些内容的,因此在logback初始化时候无法初始化LogMaskConverter类,导致报错。
而logback-spring.xml是在SpringBoot基础bean初始化完成后,则开始初始化logback,因此这个时候再引入LogMaskConverter就不会报错,因此如果要使用Spring的一些内容格式化输出,需要配置logback-spring.xml,如果不需要Spring,则logback.xml就行了。
所以我把logback.xml名字修改为logback-spring.xml后,再次启动,完美运行,不再报错了。
三、总结一下
1. logback.xml和logback-spring.xml不要乱用,有优先级,默认是存在logback.xml就使logback-spring.xml失效。
2. 如果需要使用spring的一些内容需要配置在logback-spring.xml中,如果配置在logback.xml启动开始虽然会报错,但是springboot初始化一些内容后,日志可以按照格式输出。
SpringBoot集成Logback遇到的问题 标签:集成,xml,ch,qos,SpringBoot,core,Logback,spring,logback From: https://www.cnblogs.com/kelelipeng/p/17131505.html