springcloud动态加载日志路径和log.path_IS_UNDEFINED目录问题

362 阅读1分钟

多模块工程中通常需要将不同模块服务的日志输出到指定的目录,日志目录结构如下:

- 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启动前的日志信息,如下图所示,红框中的内容。

原因是springboot启动前未加载到application.yml(或者application.properties)中的路径配置信息,之前的日志就会输出到xxx_IS_UNDEFINED的目录中。

解决方案:在logback-spring.xml中增加一个属性,内容如下:

<property name="LOG_PATH" value="${LOG_PATH:- }"/>        //-后面是空格,千万不能错

关于${LOG_PATH:- }的理解请参考:Logback配置解读