首页 > 其他分享 >logback出现大量XXX_IS_UNDEFINED日志文件的问题

logback出现大量XXX_IS_UNDEFINED日志文件的问题

时间:2022-12-07 20:09:19浏览次数:43  
标签:xml UNDEFINED 配置文件 spring XXX application logback 属性


前言

在spring boot中采用logback将日志打印到文件时,你是否遇到过文件名为XXX_IS_UNDEFINED的情况,今天带大家一块分析解决这个问题。


一、logback中spring属性读取

示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<!-- Example for logging into the build folder of your project -->
<property name="LOG_FILE" value="${BUILD_FOLDER:-logs}/${springAppName}"/>

<appender name="flatfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_FILE}-%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<!--日志大小-->
<maxFileSize>100MB</maxFileSize>
<!--日志保留时长-->
<maxHistory>30</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
<charset>utf8</charset>
</encoder>
</appender>

说明:
在logback配置文件中如果需要读取spring配置属性,需要采用如下方式:

<springProperty scope="context" name="springAppName" source="spring.application.name"/>

其中:
​​​springProperty​​​标签说明引用的是spring上下文中的配置属性。
​​​source​​​ 对应spring上下文中配置属性的名称
​​​name​​​ 属性是logback环境中对引用变量的重命名,方便引用。
采用${springAppName}方式引用变量:

<property name="LOG_FILE" value="${BUILD_FOLDER:-logs}/${springAppName}"/>

二、问题分析

出现XXX_IS_UNDEFINED这样的情况,意味着没有读到spring的配置属性。
这时一般要检查:
1、logback的xml配置文件有没有被读取到。
2、检索spring上下文中是否有引用的配置属性。
3、logback的xml配置文件的读取顺序。
特别是在引入了配置中心后,很容易出现logback.xml配置文件在读取配置中心属性之前被加载,导致出现很多引用的变量不能识别的问题。

经过分析:
在我的spring boot项目中是由于引入了注册中心的,logback的xml配置文件比spring属性文件先加载,所以读取不到spring.application.name

三、解决方案

方案一:将logback引用的变量放到bootstrap.yml中

使用过spring cloud的都知道,spring boot项目启动会最优先加载bootstrap.yml属性文件,
这样可以保证读取logback.xml时引用的属性已经在spring boot上下文中存在。

弊端:
logback引用的属性是放在配置中心中,就不能使用这种方式了。

方案二:将logback.xml配置文件名改为:logback-spring.xml

因为logback.xml的加载顺序早于springboot的application.yml配置文件当然读不到application.yml文件中的值了。

加载优先级为:
​​​logback.xml--->application.properties--->logback-spring.xml​

logback.xml加载早于application.properties,

所以如果你在logback.xml使用了变量时,而恰好这个变量是写在application.properties时,那么就会获取不到,只要改成logback-spring.xml就可以解决。

官网的说明如下:

logback出现大量XXX_IS_UNDEFINED日志文件的问题_logback


弊端:

在引入配置中心后,还是会临时出现XXX_IS_UNDEFINED的问题。

方案三:通过logging.config属性指定logback配置文件

具体步骤:
1、重命名logback配置文件:logback-custom.xml,这里名称可以自定义。
2、在application.properties中指定logback的配置文件:

#日志配置
logging.config=classpath:logback-custom.xml

这种方式是最推荐的,无论是否引入配置中心,都能保证先加载配置属性,后读取logback配置文件,保证logback配置文件中能正确引入spring上下文的配置属性。


总结

本文主要分析了使用logback打印日志时出现大量XXX_IS_UNDEFINED日志文件的问题的原因,并提供了对应的解决方案。
1、注意logback中引用spring配置属性的方法
2、注意​​​bootstrap.properties--->application.properties​​​的加载顺序
3、注意​​​logback.xml--->application.properties--->logback-spring.xml​​​的加载顺序
4、通过logging.config属性指定logback配置文件,保证logback配置文件在spring属性文件之后加载。


标签:xml,UNDEFINED,配置文件,spring,XXX,application,logback,属性
From: https://blog.51cto.com/u_15905482/5919980

相关文章

  • logback过期日志文件自动删除
    前言logback应该是目前最主流的日志框架了,在实际使用中经常遇到打印的日志文件不会自动删除,导致日志文件占有大量磁盘空间的问题。本文主要介绍logback日志文件自动删除的实......
  • logback控制台彩色日志输出
    一、logback控制台常规日志输出1、常规配置<configuration><appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"><!--输出模板--><encoder>......
  • logback性能优化详解
    前言不正确的日志打印不但会降低程序运行性能,还会占用大量IO资源和硬盘存储空间。本文主要总结一些能提高日志打印性能的手段。一、通过AsyncAppender异步输出日志我们通常......
  • logback异步输出日志详解
    前言logback应该是目前最流行的日志打印框架了,毕竟SpringBoot中默认的集成的日志框架也是logback。在实际项目开发过程中,常常会遇到由于打印大量日志而导致程序并发降低,QPS......
  • Git 常见错误 之 error: src refspec xxx does not match any / error: failed to pus
    一、简单介绍Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。[1]Git是LinusTorvalds为了帮助管理Linux......
  • 当我们的执行 java -jar xxx.jar 的时候底层到底做了什么?
    大家都知道我们常用的SpringBoot项目最终在线上运行的时候都是通过启动java-jarxxx.jar命令来运行的。那你有没有想过一个问题,那就是当我们执行java-jar命令后,到......
  • from . import XXX
    【Python】from.importXXX 一.官方文档sound/__init__.py formats/__init__.pywavread.py......
  • Customer xxxx is not defined for function xx
    创建客户记录的时候遭遇到这个问题,一看原来是自定义的Accountgroup没有被Assignedpartnerfunction,解决办法:可以到后台找到相应的路径IMG->SalesandDistribution->Basi......
  • TypeError: Cannot read properties of undefined (reading '_c') 之 vue3 数字滚动
    1.在node_modules里找到vue-count-to 2.将vue-count-tosrc文件夹里的3个文件放到自己srccomponents里调用(我这里用count-to文件包裹起来的)3.......
  • application [ROOT] appears to have started a thread named [xxxx] but has failed
    在IDEA上运行工程后,报错,查看相关资料,原因是包缺失解决:1.根据IDEA的提示,发现有好多包引入有误或引入正确,但提示引入失败2.更新build.gradle中包,等待下载完成后再运行,问......