前言

在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就可以解决。

官网的说明如下:

弊端:
在引入配置中心后,还是会临时出现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属性文件之后加载。

logback出现大量XXX_IS_UNDEFINED日志文件的问题相关推荐

  1. logback多进程写同一日志文件导致日志混乱问题

    记录一次logback多进程写同一日志文件导致日志混乱问题 参考该博客解决问题

  2. logback.xml中MaxHistory日志文件保留天数

    官网的解释 logback 启动项目时候 默认不删除多余的文件 于是加上<cleanHistoryOnStart>true</cleanHistoryOnStart>

  3. logback日志文件

    1.logback日志文件 1.加载依赖 <dependency><groupId>org.logback-extensions</groupId><!--l ...

  4. jeecgboot logback-spring.xml配置不生成新日志文件

    日志文件不随时间生成新得日志文件,一直累积在启动时的生成的日志文件里. 查找资料发现,是TimeBasedRollingPolicy和SizeBasedTriggeringPolicy冲突. 将两个去 ...

  5. Spring boot logback的使用(日志记录)

    1 在spring boot中已经自动包含了logback的jar包,如果不是spring boot需要在maven中导入依赖 <!-- https://mvnrepository.com/ar ...

  6. log日志:打印日志到控制台、文件、日志文件分区、打印错误日志到文件

    springboot默认会加载classpath:logback-spring.xml文件 如果需要自定义文件名称,在application.properties中配置logging.config 选 ...

  7. 解决spring boot logging在两个目录生成日志文件且max-history不生效

    解决spring boot logging在两个目录生成日志文件且max-history不生效 文章目录 解决spring boot logging在两个目录生成日志文件且max-history不生效 ...

  8. slf4j使用日志文件配置

    前言:虽说原生的 spring-boot-starter-web maven引用了slf4j日志工厂,但是使用起来每个类都要加一行代码 public class SyncApiRunner imple ...

  9. logback不同业务的日志打印到不同文件

    logback不同业务的日志打印到不同文件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mggwct/article/details/777181 ...

最新文章

  1. 教育部办公厅关于2020-2021学年面向中小学生的全国性竞赛活动名单的公示
  2. 玩转StyleGAN2模型:教你生成动漫人物
  3. 55天 - 算法 - 动态规划 - 数组类 从前往后
  4. Tensorflow:模型调参
  5. IDM无法连接到目标服务器
  6. 集成电路设计的运作模式
  7. 数据结构实验二---单链表的实现
  8. 科普:机器视觉技术原理解析及应用领域
  9. 如何搭建用户画像系统?以保险行业为例
  10. 高德导航java_通过拼接实现高清地图的下载-高德-java实现
  11. python删除数组元素_如何删除numpy数组中的特定元素
  12. [含lw+源码等]S2SH+mysql的报刊订阅系统[包运行成功]Java毕业设计计算机毕设
  13. 机动车尾气排放智能抓拍解决应用方案
  14. beautiful report 的简单使用
  15. Java语言 随机点名程序
  16. 哪些技术会决定前端开发者的未来发展?
  17. Creo AFX钢结构设计视频教程
  18. 机器学习之L1正则化和L2正则化(附源码解析)
  19. “数据结构基础”系列网络课程主页
  20. Angular 5 整合容联云 即时通讯

热门文章

  1. 单片机(STC系列8051内核单片机)
  2. 短信聊天软件需求征集
  3. 【python 笔记/小白快速入门python】python浅谈(一)犹抱琵琶半遮面
  4. IEEE 754 浮点数
  5. nodejs+Express+mongodb
  6. 插入摄像头时,系统右下角提示:无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常...
  7. 利用R包ggmsa进行多序列比对_2020-05-31
  8. 【论文笔记】MGU-Net
  9. 特征级融合_自动驾驶系统入门(七)- 多传感器信息融合
  10. 使用gstreamer,rtsp拉流,保存图像, jeston,使用硬件加速nvdec/nvenc