【发布时间】:2018-10-19 13:47:50
【问题描述】:
我正在使用带有 LogBack 的 SpringBoot,并且我试图将一个特定包(此处显示为“com.example.somepackagename”)的所有日志语句定向到一个文件。所有其他日志语句都应转到标准输出。
起初遇到的问题是在启动期间创建了文件“LOG_FILE_IS_UNDEFINED”。然后我在谷歌上搜索了这个问题(找到例如this on github 或this on StackOverflow 和其他一些),但没有一个附件真正解决了这个问题。
基于杂项。我使用 logback-spring.xml 文件提出了以下配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}" />
<property name="LOG_FILE" value="${LOG_FILE:-ts-msgs.log}" />
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</encoder>
</appender>
<appender name="MSG_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE}</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n%wex</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOG_PATH}/archived/debug.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<logger name="com.example.somepackagename" additivity="false" level="debug">
<appender-ref ref="MSG_LOG_FILE" />
</logger>
<logger name="org.springframework" additivity="false" level="info">
<appender-ref ref="STDOUT" />
</logger>
<root level="warn">
<appender-ref ref="STDOUT" />
</root>
</configuration>
这样,我不再得到一个名为“LOG_FILE_IS_UNDEFINED”的文件,但 LogBack 现在总是首先在应用程序的工作目录中创建一个空文件“ts-msgs.log”,然后再创建一个同名的文件临时目录(该文件应该放在哪里)。因此,不知何故,在初始化期间它已经创建了一个具有正确名称但尚未设置正确路径的文件。换句话说,SpringBoot 中 Logback 的初始化顺序似乎被破坏了(或者至少不直观),并且似乎不可能避免在定义和应用文件附加器的正确路径之前创建第一个日志文件。
如何防止创建第一个、初始和空的日志文件?这是必要的,因为工作目录通常是写保护的,并且尝试在其中创建文件会导致异常(通常是程序被终止)。
有什么提示或建议吗?
顺便说一句:我已经尝试将该文件重命名为 logback.xml(这似乎是在 SpringBoot 启动期间早些时候处理的)但这并没有解决问题,所以我保留了建议的文件名。
【问题讨论】:
-
我在使用 Spring Boot 2.1.X 时遇到了同样的问题,并且命名配置文件 logback.xml 和 logback-spring.xml 都没有帮助。
标签: spring-boot spring-logback