多模块工程中通常需要将不同模块服务的日志输出到指定的目录,日志目录结构如下:
- logs
- app1
- app2
- ...
基于上述需要,需要在logback-spring.xml中动态读取application.yml(或者application.properties)的日志路径配置。解决步骤如下:
(1)在application.yml(或者application.properties)中增加配置如下内容:
logging:
file:
path: logs/${spring.application.name}
(2)在logback-spring.xml直接通过${LOG_PATH}使用配置的日志路径,因为LOG_PATH为内置变量,默认映射的变量为logging.file.path。
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_PATH}/all.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/all.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-30MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-1}</maxHistory>
</rollingPolicy>
</appender>
完成上述配置工作,app1的日志就会输出到当前工程下的logs/app1/all.log文件中。但是,当前工程下会出现一个类似log.path_IS_UNDEFINED的目录,也有all.log日志文件,但是打开日志文件发现内容只有springboot启动前的日志信息,如下图所示,红框中的内容。
![](https://img-blog.csdnimg.cn/580b9ef76ebf417d802fe2e748a93456.png)
原因是springboot启动前未加载到application.yml(或者application.properties)中的路径配置信息,之前的日志就会输出到xxx_IS_UNDEFINED的目录中。
解决方案:在logback-spring.xml中增加一个属性,内容如下:
<property name="LOG_PATH" value="${LOG_PATH:- }"/> //-后面是空格,千万不能错
关于${LOG_PATH:- }的理解请参考:https://www.cnblogs.com/fanxia/p/14079495.html#log_path--%E7%90%86%E8%A7%A3