删除文件后,Logback 不会重新创建日志文件

Posted

技术标签:

【中文标题】删除文件后,Logback 不会重新创建日志文件【英文标题】:Logback does not recreate log file after file has been deleted 【发布时间】:2018-04-07 20:09:06 【问题描述】:

我有一个在 Tomcat 服务器上运行的记录器应用程序。我在 Spring Boot 框架上使用 logback。 下面是我的 logback.xml 文件

<configuration debug="true">
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/audit/audit.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>/var/log/audit/audit_%dyyyy-MM-dd.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 50MB -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- keep 30 days' worth of history -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.logger.rest">
        <appender-ref ref="FILE" />
    </logger>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

我的应用程序正确记录到 /var/log/audit/audit.log。但有时我需要删除日志文件。删除后,我注意到调用记录器应用程序时没有创建新的 audit.log 文件。只有当我重新启动记录器应用程序时才会生成新的日志文件。

有什么方法可以绕过应用重启,以便 logback 自动创建一个新的 audit.log 文件(在创建日志记录信息时)以防它被删除

【问题讨论】:

【参考方案1】:

当您的应用程序正在运行时(并且您的应用程序中的 Logback 具有日志文件的打开句柄),如果您删除日志文件,那么 Logback 将不知道该文件已被删除(因为 Logback 进程仍然有一个打开文件句柄),但由于文件 被删除,Logback 实际上无法将任何内容写入磁盘,并且这种情况一直存在,直到重新初始化 Logback(并且您的 FileAppender 重新创建文件)。通常,这将在应用程序启动时完成。

有一个open issue 反对 Logback,要求在这种情况下更改 Logback 的行为。

删除应用程序的日志记录子系统(即 Logback)配置为在应用程序处于活动状态时写入的文件有点不寻常。也许您试图通过删除文件来解决的问题可以通过其他方式解决?如果不是,即如果您必须能够删除运行中的日志文件并期望 Logback 创建一个新文件,那么我认为您的选择是:

Vote for issue 并希望尽快解决 提交 PR 并修复该问题 Fork Logback 并创建您自己的补丁版本

【讨论】:

【参考方案2】:

The accepted answer above 是完全正确的 - 如果您无论如何都必须“删除”一个日志文件,因为某种原因另一种选择是自己重新创建它,或者只是“截断”它而不是删除:

$truncate -s0 /var/log/audit/audit.log

# or if your shell does not support `truncate` (like mine on mac) try redirecting no content to your logfile:
$ :> /var/log/audit/audit.log

至少在我的情况下这完全没问题,logback 只是继续记录......

【讨论】:

以上是关于删除文件后,Logback 不会重新创建日志文件的主要内容,如果未能解决你的问题,请参考以下文章

LogBack 日志压缩产生上百G的tmp文件问题 logback同时按照日期和大小分割日志

Java Logback配置文件这么写,还愁不会整理日志?

压缩包解压后可以删除吗

logback:fileAppender输出到文件

13.7 SpringBoot集成日志系统logback的几个问题

spring boot logback日志logback 生成日志文件在本项目下,而不在指定的日志文件目录下/指定日志文件到达最大值后不按照配置进行切割