我试图设置一个滚动日志追加器,它将每天翻转,以及当日志文件达到特定阈值大小时翻转。我有一个主要工作的设置,但是如果我重新启动应用程序,翻转行为就会完全中断。
我当前的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并被转储到其中一个带有日期戳的文件。
但是,如果我重新启动应用程序,事情会变得混乱。主日志文件永远不会被清除,但它会反复复制,每次复制的大小都会增加。什么都没有被清除。
我允许它一直运行,直到每次&#34;翻转&#34;超过500KB,远高于我的maxFileSize
10KB。
这种行为只是一个错误吗?如果没有,我是否在配置上出错?我该如何解决这个问题?
答案 0 :(得分:0)
问题是由于重新启动(web)应用程序时未能完全关闭logback LoggerContext
引起的。
在我的情况下,webapp正在停止并通过sbt中的container:start
和container: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();