logback 手动调用翻转
logback manually call rollover
使用 logback 我想在每次异步作业启动时启动新日志,所以我需要手动调用翻转。但是当我尝试获取 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>
我这样调用翻转:
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();
我扩展了 TimeBasedRollingPolicy<E>
以便我的日志将在我触发异步作业时启动:
@NoAutoStart
public class ManualRollingPolicy<E> extends TimeBasedRollingPolicy<E> {
}
有人可以帮我解决这个问题吗?
编辑:经过进一步调查,我可以看到 LogF
的 appenderList
大小为 1,我的自定义 RollingPolicy
已正确设置。但是,此 appender 的 name
属性 设置为 null,我认为这就是我无法通过名称获取它的原因。
所以我得到了一个非常巧妙的解决方法,我认为有人可能会觉得有用。您可以使用 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>
然后你手动调用:
MDC.put("id",id);
为了开始新的日志,当你完成这个特定的日志文件时,你只需记录一个 FINALIZE_SESSION_MARKER
常量:
logger.info(ClassicConstants.FINALIZE_SESSION_MARKER)
。在我看来,它足够灵活,可以解决手动翻转的问题。
我终于弄明白了如何以编程方式执行此操作。
以防其他人偶然发现这个问题。
手动翻转:
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();
}
我使用的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>
这将进行 SizeBased 滚动,并允许您根据要求手动滚动。
使用 logback 我想在每次异步作业启动时启动新日志,所以我需要手动调用翻转。但是当我尝试获取 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>
我这样调用翻转:
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();
我扩展了 TimeBasedRollingPolicy<E>
以便我的日志将在我触发异步作业时启动:
@NoAutoStart
public class ManualRollingPolicy<E> extends TimeBasedRollingPolicy<E> {
}
有人可以帮我解决这个问题吗?
编辑:经过进一步调查,我可以看到 LogF
的 appenderList
大小为 1,我的自定义 RollingPolicy
已正确设置。但是,此 appender 的 name
属性 设置为 null,我认为这就是我无法通过名称获取它的原因。
所以我得到了一个非常巧妙的解决方法,我认为有人可能会觉得有用。您可以使用 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>
然后你手动调用:
MDC.put("id",id);
为了开始新的日志,当你完成这个特定的日志文件时,你只需记录一个 FINALIZE_SESSION_MARKER
常量:
logger.info(ClassicConstants.FINALIZE_SESSION_MARKER)
。在我看来,它足够灵活,可以解决手动翻转的问题。
我终于弄明白了如何以编程方式执行此操作。 以防其他人偶然发现这个问题。
手动翻转:
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();
}
我使用的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>
这将进行 SizeBased 滚动,并允许您根据要求手动滚动。