背景
在配置logback-spring.xml
时,发现线上对对应的目录没有生成文件,并且本地运行的时候也没有在指定目录生成日志,而是工程根目录下LOG_PATH_IS_NOT_DEFINED打印了一部分日志。
配置如下:
application.properties
logging.level.root=INFO
logging.path=/A/B
logback-spring.xml
<appender name="TIME_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_PATH}/${artifactId}-info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${artifactId}-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>15</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
<maxFileSize>500MB</maxFileSize>
</rollingPolicy>
</appender>
<root level="${logging.level.root}">
<appender ref="TIME_FILE" />
</root>
分析
由于本地打的目录的提示,首先怀疑的就是${LOG_PATH}
并没有解析正确导致。
但是根据Spring Boot的官方文档来看:
If you look at
base.xml
in the spring-boot jar, you can see that it uses some useful System properties that theLoggingSystem
takes care of creating for you:
${PID}
: The current process ID.${LOG_FILE}
: Whetherlogging.file
was set in Boot’s external configuration.${LOG_PATH}
: Whetherlogging.path
(representing a directory for log files to live in) was set in Boot’s external configuration.${LOG_EXCEPTION_CONVERSION_WORD}
: Whetherlogging.exception-conversion-word
was set in Boot’s external configuration.
spring会把logging.path
设置到System的properties里,但是为什么没有生效呢?
网上对于这部分的资料有点少,所以决定自己去DEBUG。找到了一篇Spring Boot的日志系统文档。
为了控制日志的启动,
spring定义了一个LoggingSystem
抽象类,并且提供了默认的LogbackLoggingSystem
和Log4j2LoggingSystem
。LoggingApplicationListener
负责监听启动事件,通过initilize方法
进行初始化,会通过Environment
环境获取LogFile
, 如果Logfile
不为空的情况,就会使用系统环境中的LOG_PATH
和LOG_FILE
两个变量.
而LOG_FILE
是通过logging.file
配置读取的,这就代表只有配置了logging.file
才会有LOG_PATH
变量生效。
这也就解释了为什么LOG_PATH
没有生效。
并且可以如下配置:
<root>
<appender ref="TIME_FILE" />
</root>
在application.properties中配置:
logging.level.root=ERROR
Spring在启动的过程中,会动态设置logger的日志级别。