logback手动调用翻转

Sok*_*owy 6 java logging spring logback

使用logback我想在每次异步作业启动时启动新日志,所以我需要手动调用rollover.但是当我试图获得appender时,我会得到null.以下是我的配置:

<configuration scan="true">
    <timestamp key="time" datePattern="yyyy-MM-dd_HH_mm"/>
    <logger name="com.my.com.pany" level="DEBUG">
        <appender name="TEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>logs/log_TEST_${time}.log</file>
            <triggeringPolicy
                    class="com.my.com.pany.myapp.logging.ManualRollingPolicy">
            </triggeringPolicy>
            <append>true</append>
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    </logger>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我这样称为翻转:

  ch.qos.logback.classic.Logger logF = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.my.com.pany");
        RollingFileAppender<ILoggingEvent> appender = (RollingFileAppender<ILoggingEvent>) logF.getAppender("test");
        appender.rollover();
Run Code Online (Sandbox Code Playgroud)

我进行了扩展,TimeBasedRollingPolicy<E>以便在触发异步作业时启动我的日志:

@NoAutoStart
public class ManualRollingPolicy<E> extends TimeBasedRollingPolicy<E> {
}
Run Code Online (Sandbox Code Playgroud)

可以帮我解决这个问题吗?编辑:在一些进一步的调查,我可以看到LogFappenderList哪个有我的自定义尺寸1的RollingPolicy设置正确.但是name这个appender的属性被设置为null,我认为这就是为什么我不能通过名字得到它的原因.

Sok*_*owy 6

所以我得到了一个非常整洁的解决方法,我认为有人可能会觉得有帮助.您可以使用SiftingAppender."顾名思义,SiftingAppender可用于根据给定的运行时属性分离(或筛选)日志记录"

因此,您将appender配置为采用一些独特的参数,在我的情况下,批处理作业启动的日期:

<appender name="FULL" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <key>id</key>
            <defaultValue>000000</defaultValue>
        </discriminator>

        <sift>
            <appender name="FULL-${id}" class="ch.qos.logback.core.FileAppender">
                <file>logs/log_${id}.log</file>
                <append>false</append>
                <layout class="ch.qos.logback.classic.PatternLayout">
                    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
                </layout>
            </appender>
        </sift>
    </appender>
Run Code Online (Sandbox Code Playgroud)

然后你手动调用: MDC.put("id",id);为了启动新的日志,当你完成这个特殊的日志文件时,你只需记录一个FINALIZE_SESSION_MARKER常量: logger.info(ClassicConstants.FINALIZE_SESSION_MARKER).在我看来,它足够灵活,它回答了手动翻转的问题.


Nox*_*mon 6

我终于弄清楚了如何以编程方式执行此操作。万一其他人偶然发现了这个问题。

手动翻转:

public static void manuallyRolloverLog() {
    ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(MainActivity.class);
    RollingFileAppender file = (RollingFileAppender) log.getAppender("FILE");
    file.rollover();
}
Run Code Online (Sandbox Code Playgroud)

我使用的XML配置如下:

<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>AppLog.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>AppLog.%i.log.zip</fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>3</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
        <pattern>%d %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender>

<root level="DEBUG">
    <appender-ref ref="FILE" />
</root>
Run Code Online (Sandbox Code Playgroud)

这将进行基于大小的滚动,并允许您根据要求手动进行滚动。

  • 我尝试在代码中添加对 rollover() 的调用,但出现异常: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.lastIndexOf(int)' on a null object reference at ch. qos.logback.core.rolling.helper.FileFilterUtil.afterLastSlash(未知来源) 在 ch.qos.logback.core.rolling.TimeBasedRollingPolicy.rollover(未知来源) 在 ch.qos.logback.core.rolling.RollingFileAppender.attemptRollover(未知来源)位于 ch.qos.logback.core.rolling.RollingFileAppender.rollover(未知来源) 有什么想法吗? (3认同)