删除文件后,Logback 不会重新创建日志文件
Logback does not recreate log file after file has been deleted
我有一个在 Tomcat 服务器上运行的记录器应用程序。我在 spring 引导框架上使用 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_%d{yyyy-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 文件(在创建日志记录信息时),以防它被删除
虽然您的应用程序是 运行(并且您的应用程序中的 Logback 有一个打开的日志文件句柄)如果您删除日志文件,那么 Logback 将不知道该文件已被删除(因为Logback 进程仍然有一个打开的文件句柄)但由于文件 已被删除 Logback 实际上无法将任何内容写入磁盘并且这种情况一直持续到 Logback 重新初始化(并且您的 FileAppender 重新创建文件)。通常,这将在应用程序启动时完成。
有一个 open issue 反对 Logback 请求更改 Logback 在这种情况下的行为。
在应用程序 活动 时删除配置为写入的应用程序日志子系统(即 Logback)的文件有些不寻常。也许您试图通过删除文件来解决的问题可以通过其他方式解决?如果不是,即如果您 必须 能够删除运行中的日志文件并期望 Logback 创建一个新文件,那么我认为您的选择是:
- Vote for issue希望尽快解决
- 提交 PR 以修复该问题
- 分叉 Logback 并创建您自己的补丁版本
是完全正确的——如果您出于某种原因无论如何都必须“删除”日志文件,另一种选择是自己重新创建它或只是“截断”它而不是删除:
$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 只是继续记录...
我有一个在 Tomcat 服务器上运行的记录器应用程序。我在 spring 引导框架上使用 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_%d{yyyy-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 文件(在创建日志记录信息时),以防它被删除
虽然您的应用程序是 运行(并且您的应用程序中的 Logback 有一个打开的日志文件句柄)如果您删除日志文件,那么 Logback 将不知道该文件已被删除(因为Logback 进程仍然有一个打开的文件句柄)但由于文件 已被删除 Logback 实际上无法将任何内容写入磁盘并且这种情况一直持续到 Logback 重新初始化(并且您的 FileAppender 重新创建文件)。通常,这将在应用程序启动时完成。
有一个 open issue 反对 Logback 请求更改 Logback 在这种情况下的行为。
在应用程序 活动 时删除配置为写入的应用程序日志子系统(即 Logback)的文件有些不寻常。也许您试图通过删除文件来解决的问题可以通过其他方式解决?如果不是,即如果您 必须 能够删除运行中的日志文件并期望 Logback 创建一个新文件,那么我认为您的选择是:
- Vote for issue希望尽快解决
- 提交 PR 以修复该问题
- 分叉 Logback 并创建您自己的补丁版本
$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 只是继续记录...