SpringBoot 与 LogBack 创建 LOG_FILE_IS_UNDEFINED 文件夹

mmo*_*mmo 11 spring-boot spring-logback

我正在使用带有 LogBack 的 SpringBoot,我试图将一个特定包(此处显示为“com.example.somepackagename”)的所有日志语句定向到一个文件。所有其他日志语句都应该转到标准输出。

起初遇到的问题是在启动过程中创建了一个文件“LOG_FILE_IS_UNDEFINED”。然后我在这个问题上用谷歌搜索(例如在 github找到了这个,或者在 StackOverflow找到了这个和其他一些),但没有一个附加内容真正解决了这个问题。

基于杂项。我使用 logback-spring.xml-file 提出了以下配置:

<?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>
Run Code Online (Sandbox Code Playgroud)

有了这个,我不再得到一个名为“LOG_FILE_IS_UNDEFINED”的文件,但 LogBack 现在总是首先在应用程序的工作目录中创建一个空文件“ts-msgs.log”,然后在临时文件中创建一个具有相同名称的文件 -目录(该文件应该放在哪里)。因此,在初始化过程中,它已经以某种方式创建了一个具有正确名称的文件,但尚未设置正确的路径。换句话说,SpringBoot 中 Logback 的初始化顺序似乎被破坏了(或者至少不直观),并且似乎不可能避免在定义和应用文件附加器的正确路径之前创建第一个日志文件。

如何防止创建第一个、初始和空的日志文件?这是必要的,因为工作目录通常是写保护的,在那里创建文件的尝试会导致异常(通常是程序被终止)。

任何提示或建议?

顺便说一句:我已经尝试将该文件重命名为 logback.xml(似乎在 SpringBoot 启动期间更早处理过),但这并没有解决问题,所以我保留了建议的文件名。

Eri*_*ang 3

我遇到类似的问题,在应用程序启动时可能会生成以下空文件:

  • LOG_PATH_IS_UNDEFINED
  • LOG_FILE_IS_UNDEFINED

原因

日志中的相关配置application.yml,是logback-spring.xml解析后才读取的,所以无法读取。


可能的解决方案

我找到了 3 种可能的解决方案,请选择最适合您情况的一种:

  1. 将日志记录配置从application.yml移至bootstrap.yml,这将需要spring-cloud依赖关系才能使其工作。

    • 这是有效的,因为bootstrap.yml之前已阅读过logback-spring.xml
    • 如果您不使用spring-cloud,这可能不是您的最佳选择,因为额外的依赖项是不必要的。
  2. 直接定义路径和文件logback-spring.xml
    例如

     <configuration>
         <springProperty name="LOG_PATH" source="logging.path" defaultValue="logs/" />
         <springProperty name="LOG_FILE" source="logging.file" defaultValue="app.log" />
    
    Run Code Online (Sandbox Code Playgroud)

    在这种情况下,如果日志文件名需要不同,并且不能简单地将配置文件放在共享的公共依赖项中,则可能需要将“logback-spring.xml”添加到每个子项目中。

  3. 只需保留配置application.yml,并通过设置忽略生成的空文件.gitinore
    例如

     LOG_*_IS_UNDEFINED
    
    Run Code Online (Sandbox Code Playgroud)

    在这种情况下,尽管会生成空文件application.yml,但日志仍会写入 指定的文件中。


尖端

  • 上面提到的文件logback-spring.xml可能是logback.xml您的情况或其他名称。