问题背景
在我们的SpringBoot 2.4
项目中,我们使用Logback作为我们的日志框架。我们注意到在项目的根路径下面出现了一个名为 LOG_PATH_IS_UNDEFINED
的文件夹,我们所有的日志文件都在这个文件夹中。定义的日志文件并没有在指定的路径中生成。
原因分析
经过分析推测是 logback 配置文件存在问题,因为日志的输出格式是正确的,生成的文件也是正确,文件存放路径是错误的,应该是路径配置出现了问题,这里有一个代码片段:
xml
<appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="TRACE_FILE">
<file>${LOG_PATH}/trace.log</file>
...
</appender>
...
<property name="LOG_PATH" value="./logs"/>
在这段代码中,LOG_PATH
是我们定义的一个变量,它被用来指定我们日志文件的路径。但是问题在于,我们在使用这个变量的地方(file
元素的LOG_PATH
)之前,我们就需要它的值,这导致在logback尝试解析${LOG_PATH}
的时候,它并没有找到对应的值,于是作为默认值,logback就使用了LOG_PATH_IS_UNDEFINED
。
解决方法
解决这个问题的方法是需要保证我们在使用LOG_PATH
变量之前定义它。我们可以将定义LOG_PATH
的那行代码移动到<configuration>
标签的开头:
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="./logs"/>
...
</configuration>
要避免这种问题的发生,需要确保在使用任何变量之前都已经定义了它。特别是在配置文件中,我们需要明确知道配置文件的解析顺序,也就是说,当使用某个配置属性时,必须确保它已经在之前的位置被定义。如果在使用的地方之前没有定义,将会导致未定义的默认值(如本例中的 "LOG_PATH_IS_UNDEFINED")被使用。