滚动日志文件未被清除

时间:2016-01-19 15:37:43

标签: java logging logback

我试图设置一个滚动日志追加器,它将每天翻转,以及当日志文件达到特定阈值大小时翻转。我有一个主要工作的设置,但是如果我重新启动应用程序,翻转行为就会完全中断。

我当前的appender配置,基于http://logback.qos.ch/manual/appenders.html#SizeAndTimeBasedFNATP

<appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${my.log.dir}/mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- rollover daily -->
        <fileNamePattern>${my.log.dir}/mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
        <cleanHistoryOnStart>true</cleanHistoryOnStart>
        <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <!-- or whenever the file size reaches 10KB -->
            <maxFileSize>10KB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <encoder>
      <pattern>%-5level %d{HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

我添加了一个&#34; LogSpammer&#34;脚本快速生成日志数据,第一次运行应用程序时,一切似乎都很好。 mylog.txt达到~10KB并被转储到其中一个带有日期戳的文件。

Log files the first time I run. Everything seems ok

但是,如果我重新启动应用程序,事情会变得混乱。主日志文件永远不会被清除,但它会反复复制,每次复制的大小都会增加。什么都没有被清除。

Log files the second time I run. File sizes keep growing. Not good!

我允许它一直运行,直到每次&#34;翻转&#34;超过500KB,远高于我的maxFileSize 10KB。

这种行为只是一个错误吗?如果没有,我是否在配置上出错?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

问题是由于重新启动(web)应用程序时未能完全关闭logback LoggerContext引起的。

在我的情况下,webapp正在停止并通过sbt中的container:startcontainer:stop启动。这类似于&#34;部署&#34;和&#34;取消使用&#34; Tomcat上的.war文件。由于JVM没有关闭,也没有显式停止logback,因此它能够保留对主日志文件的锁定。之后调用container:start会导致问题中描述的怪异。

完全关闭JVM,然后运行container:start,使记录器/翻转功能正常运行。

在网络应用期间调用LoggerContext stop方法&#34;卸载&#34; hook解决了这个问题:

// I happened to be using slf4j's, so I use its LoggerFactory
// class to get the LoggerContext instance
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
lc.stop();