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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: logback出现大量XXX_IS_UNDEFINED日志文件的问题

前言


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


官网的说明如下:

6.png

弊端:

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
427 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
2月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
91 5
|
3月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
354 3
|
2月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
158 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
2月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
2月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
|
2月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
51 1
|
2月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
3月前
|
监控 Linux 应用服务中间件
系统监控:使用日志文件 journalctl的使用
本文介绍了如何使用`journalctl`命令来监控和查看Linux系统的日志文件,包括查看特定行数、过滤日志级别、实时跟踪日志、按时间段查询日志以及日志轮换和压缩的配置。
111 2
系统监控:使用日志文件 journalctl的使用
|
3月前
|
存储 Java Android开发
Android|记一个导致 logback 无法输出日志的问题
在给一个 Android 项目添加 logback 日志框架时,遇到一个导致无法正常输出日志的问题,这里记录一下。
45 2