SpringBoot集成Logback遇到的问题

 

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项目遇到的问题

  1. 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遇到的问题
posted @ 2023-02-17 21:04  kelelipeng  阅读(1162)  评论(0编辑  收藏  举报