'How to force log4j2 rolling file appender to roll over?

To my best knowledge, RollingFileAppender in log4j2 will not roll over at the specified time (let's say - at the end of an hour), but at the first log event that arrives after the time threshold has been exceeded.

Is there a way to trigger an event, that on one hand will cause the file to roll over, and on another - will not append to the log (or will append something trivial, like an empty string)?



Solution 1:[1]

Following Remko's idea, I wrote the following code, and it's working.

package com.stony;

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.rolling.*;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;

@Plugin(name = "ForceTriggerPolicy", category = "Core")
public class ForceTriggerPolicy implements TriggeringPolicy {
private static boolean isRolling;

@Override
public void initialize(RollingFileManager arg0) {
    setRolling(false);
}

@Override
public boolean isTriggeringEvent(LogEvent arg0) {
    return isRolling();
}

public static boolean isRolling() {
    return isRolling;
}

public static void setRolling(boolean _isRolling) {
    isRolling = _isRolling;
}

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

}

Solution 2:[2]

If you have access to the Object RollingFileAppender you could do something like:

rollingFileAppender.getManager().rollover();

Here you can see the manager class:

https://github.com/apache/logging-log4j2/blob/d368e294d631e79119caa985656d0ec571bd24f5/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Stony
Solution 2 LightDragooon