如何强制 logback 在翻转时创建新文件

Posted

技术标签:

【中文标题】如何强制 logback 在翻转时创建新文件【英文标题】:How to force logback to create a new file on rollover 【发布时间】:2013-12-06 10:24:54 【问题描述】:

我正在尝试使用 logback 实现与当前使用 log4j 相同的功能 - 一个大小和时间基准的滚动文件附加程序。 滚动时应使用当前时间戳创建新文件,但 logback 仍会写入旧文件。

我正在使用类似的东西:

<timestamp key="bySecond" datePattern="yyyyMMddkkmmss"/> 

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
  <file>$logback.PREFIX-$bySecond.log</file> 
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
    <fileNamePattern>$logback.PREFIX-%dyyyy-MM-dd.%i.log.gz</fileNamePattern> 
    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
        <maxFileSize>1GB</maxFileSize> 
    </timeBasedFileNamingAndTriggeringPolicy> 
  </rollingPolicy> 

想要的行为:

应用程序以 my-20131206105823.log 开头 发生滚动事件(1GB 或午夜) my-2013-12-06.0.log.gz 文件已创建 应用程序恢复登录 my-20131207000001.log

当前行为:

应用程序以 my-20131206105823.log 开头 发生滚动事件(1GB 或午夜) my-2013-12-06.0.log.gz 文件已创建 应用程序恢复登录 my-20131206105823.log

如果我也能了解如何仅在当天翻转而不是尺寸上完成此操作,那就太好了,但这可能就足够了。

带有 logback-1.0.9 的 Java 1.7

【问题讨论】:

作为更新,有一种方法可以让 appender 也滚动活动文件:省略 参数,这意味着 appender 将始终写入由 fileNamePattern 定义的文件。但这仍然没有达到我想要的行为。 最后我扩展了 TimeBasedRolling 策略以接受一个额外的 activeFilename 参数(类似于 fileNamePattern)并用于更改活动文件名。我很想知道是否有更简单/更清洁的方法来执行此操作,并且仍然可以使用不同的文件名正常进行归档。 【参考方案1】:

我不确定,但让我尝试解决它。滚动事件发生后,“my-20131206105823.log”文件的内容将被复制到“my-2013-12-06.0.log.gz”,您将再次获得具有相同旧名称的新文件,即“我的-20131206105823.log”。

<file>$logback.PREFIX-$bySecond.log</file>

$bySecond 仅在您启动应用程序时分配一次,它不会在每次回滚时更改。时间戳只是一个变量。检查here

也可以查看one。

【讨论】:

确实,这就是问题所在。一种方法是扩展 RollingFileAppender 并在每个翻转事件上创建新文件。考虑到所有其他变量只初始化一次,我在想可能有一个 logback 配置设置允许这样做。

以上是关于如何强制 logback 在翻转时创建新文件的主要内容,如果未能解决你的问题,请参考以下文章

logback.xml可以写if吗

如何在logback日志配置文件中配置相对路径

logback按天生成日志系统重启之后还会生成吗

logback的MDC机制

Log4j,Log4j2,Logback,Slf4J日志框架你真的了解吗?阿里巴巴Java开发手册为什么强制推荐使用Slf4j?

如何在通过 log4j 创建新日志文件时将日志添加到 Syslog?