Log4j2自动翻转调度程序

时间:2019-01-09 07:58:51

标签: java log4j2

如何配置log4j2每30秒进行一次翻转?

例如,如果今天是2019年1月9日09:45:00,我通过命令将数据写入日志文件

log.info("test")

在10分钟内没有更多数据要记录, 但我需要在2019-01-09 09:45:30 30秒后自动翻转日志文件。

如果我这样配置log4j2:

<RollingFile name="RollingFile">
  <FileName>C:/log/mylog.log</FileName>
  <FilePattern>C:/log/time-based-logs/%d{yyyy-MM-dd-hh-mm}.log.zip</FilePattern>
  <PatternLayout>
    <Pattern>%d{yyyy-MMM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n</Pattern>
  </PatternLayout>
  <Policies>
    <TimeBasedTriggeringPolicy interval="2" modulate="true" />
  </Policies>
  <DefaultRolloverStrategy max="5" />
</RollingFile>

我必须通过命令

写入日志数据
log.info("test1")      // 2019-01-09 09:55:00

然后在10分钟后转到翻转文件,但是我需要每30秒一次,甚至不再需要向日志中写入数据。

我该怎么办?

对于我的英语不好,我深表歉意。

2 个答案:

答案 0 :(得分:1)

使用RollingFileAppender https://logback.qos.ch/manual/appenders.html#RollingFileAppender

和TimeBasedRollingPolicy https://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy

但是,这可以使您细化到分钟(和每秒,但不是30秒)。

如果这还不够,请编写自己的自定义RollingPolicy https://logback.qos.ch/apidocs/ch/qos/logback/core/rolling/RollingPolicy.html

或者只是扩展TimeBasedRollingPolicy以包括其他功能 https://logback.qos.ch/apidocs/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.html

答案 1 :(得分:0)

这个选项适合我

public class Utils {
public static void rollover(LoggerContext loggerContext) {
    Map<String, Appender> appendersByName = loggerContext.getConfiguration().getAppenders();

    appendersByName.values().forEach(appender -> {
        if (appender instanceof RollingFileAppender) {
            ((RollingFileAppender) appender).getManager().checkRollover(new RolloverLogEvent());
        }
    });
}
}

@Plugin(name = "OnTriggeringPolicy", category = "Core", printObject = true)
public class OnCustomTriggeringPolicy implements TriggeringPolicy {

private RollingFileManager manager;

@PluginFactory
public static OnRolloverEventEventTriggeringPolicy createPolicy() {
    return new OnRolloverPolicy();
}

@Override
public void initialize(RollingFileManager manager) {
    this.manager = manager;
}

@Override
public boolean isTriggeringEvent(LogEvent logEvent) {

    return manager.getFileSize() > 0;
}
}