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

时间:2017-10-26 12:29:32

标签: java tomcat spring-boot logging logback

我有一个在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_%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文件。只有当我重新启动记录器应用程序时才会生成新的日志文件。

有没有办法可以绕过app重启,以便logback自动创建一个新的audit.log文件(创建日志信息时),以防它被删除

2 个答案:

答案 0 :(得分:7)

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

对于Logback,有open issue请求在这种情况下更改Logback的行为。

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

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

答案 1 :(得分:0)

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

DECLARE @Previous_Amount INT =500       

;WITH CTE AS
(
SELECT   SUM(AMOUNT) OVER (ORDER BY Ranking DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 
 - @Previous_Amount - ISNULL(SUM(QUOTA) OVER (ORDER BY Ranking DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ),0)  AS ComputedDifferenc, *
FROM  @TABLE1 
)
SELECT  Ranking,Quota,Amount,CASE WHEN  ComputedDifferenc > Quota THEN Quota ELSE CASE WHEN ComputedDifferenc >0 THEN ComputedDifferenc ELSE 0 END END AS Cum_Diff

FROM CTE

至少在我的情况下这是完全可以的,并且注销只是继续记录...