我正在使用带有LogBack的SpringBoot,我试图将一个特定包的所有日志语句(此处显示为“com.example.somepackagename”)指向一个文件。所有其他日志语句都应该转到stdout。
首先遇到的问题是,在启动过程中创建了一个文件“LOG_FILE_IS_UNDEFINED”。然后我搜索了该问题(例如this on github或this on StackOverflow以及其他一些问题),但没有任何附加内容真正解决了这个问题。
基于misc。描述我使用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启动期间似乎早先处理过)但是没有解决问题,所以我保留了建议的文件名。
答案 0 :(得分:1)
我遇到类似的问题,在应用程序启动时,可能会生成以下空文件:
LOG_PATH_IS_UNDEFINED
LOG_FILE_IS_UNDEFINED
application.yml
解析后读取logback-spring.xml
中与日志相关的配置,因此无法读取。
我找到了3种可能的解决方案,选择最适合您的情况的一种解决方案:
将日志记录配置从application.yml
移至bootstrap.yml
,这需要spring-cloud
依赖性才能使其正常工作。
bootstrap.yml
之前读取了logback-spring.xml
。spring-cloud
,则这不是您的最佳选择,因为不需要额外的依赖项。直接在logback-spring.xml
中定义路径和文件。
例如
<configuration>
<springProperty name="LOG_PATH" source="logging.path" defaultValue="logs/" />
<springProperty name="LOG_FILE" source="logging.file" defaultValue="app.log" />
在这种情况下,如果日志文件名需要不同并且不能简单地将配置文件置于共享的公共依赖项中,则可能需要在每个子项目中添加“ logback-spring.xml”。
只需将配置保留在application.yml
中,并通过设置.gitinore
忽略生成的空文件。
例如
LOG_*_IS_UNDEFINED
在这种情况下,尽管生成了空文件,日志仍会写入由application.yml
指定的文件中。
logback-spring.xml
文件可能是logback.xml
或您的情况下的其他名称。