【问题标题】:Create new log file each run in logback?每次在 logback 中运行时创建新的日志文件?
【发布时间】:2019-02-08 20:28:55
【问题描述】:

应用程序每次运行时如何创建新的日志文件?

我想以任何方式保留以前的日志。例如,我更愿意按创建时间和日期来命名每个新日志文件。否则,我同意将旧的日志文件备份到日期和时间文件名中。

很遗憾,我在这里看不到合适的政策和/或触发器:http://logback.qos.ch/manual/appenders.html

更新

我大致按照“复制”中所说的那样制作

    <appender name="ROUTINEAPPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/routine.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/routine%d{yyyyMMdd}%d{HHmmss,aux}.log</fileNamePattern>
            <TimeBasedFileNamingAndTriggeringPolicy class="com.inthemoon.toolkit.StartupTimeBasedTriggeringPolicy" />
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} - %C{0} - %msg%n</pattern>
        </encoder>
    </appender>

但我的班级 com.inthemoon.toolkit.StartupTimeBasedTriggeringPolicy 从未被调用过。我在start() 方法中设置了断点,但它从未引发过。

此外,不会发生滚动。日志文件已创建,但其名称始终为 routine.log

我也不明白,参数filefilenamePattern应该如何共存。

更新 2

我已经修复了UPDATE 1 类引用,但仍然没有我需要的东西。在给定的解决方案中,日期时间被插入到 OLD 日志文件名中。例如,如果我在 2013 年运行程序,它会创建 routine.log。然后我等了一年,在2014年运行程序。新的日志文件将被创建并命名为routine.log,而OLD 2013日志将被放入routine2014XXXXXXXXXX.log,这绝对无关紧要。

每次程序启动时我都需要创建一个新文件,并用日期时间戳标记这个文件。

【问题讨论】:

    标签: java logback


    【解决方案1】:

    以下配置会在程序每次运行时创建一个新的日志文件和控制台输出,请注意不使用RollingFileAppender。更多信息请参考 logback 文档https://logback.qos.ch/manual/configuration.html

    <configuration>
        <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</Pattern>
            </layout>
        </appender>
        <appender name="FILE" class="ch.qos.logback.core.FileAppender">
            <file>logfile-${bySecond}.txt</file>
            <append>true</append>
            <encoder>
                <Pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</Pattern>
            </encoder>
        </appender>
        <root level="info" additivity="false">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE"></appender-ref>
        </root>
    </configuration>
    

    【讨论】:

    • 如果两个使用它的进程被调用的时间间隔小于 1 秒(甚至毫秒)?
    • 该文件将每次创建,而不仅仅是在服务启动时创建一次
    • 更改:true 为 FALSE !!!
    【解决方案2】:

    如果您想继续使用RollingFileAppender,您可以创建自己的TriggeringPolicy,这将始终在第一次调用时触发生成新的日志文件。

    @NoAutoStart
    public class StartupTriggeringPolicy<E> extends TriggeringPolicyBase<E> {
        private boolean triggerRollover = true;
    
        @Override
        public boolean isTriggeringEvent(final File activeFile, final E event) {
            if (!triggerRollover) { return false; }
            triggerRollover = false;
            return true;
        }
    }
    

    然后您可以在logback.xml&lt;appender&gt; 配置中设置triggeringPolicy 属性:

    <appender name="startupRolloverAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <triggeringPolicy class="com.your.package.StartupTriggeringPolicy"/>
        <!-- other configurations -->
    </appender>
    

    【讨论】:

      最近更新 更多