Получить имя файла для накатанного файла в log4j2 - PullRequest
0 голосов
/ 08 ноября 2018

Я использую файл appender в log4j2 и использую политику запуска по времени. Вот как выглядит мой файл конфигурации:

...
<RollingFile name="RollingFile" fileName="logs/temp.log" filePattern="logs/test1-%d{MM-dd-yy-HH-mm-ss-SSS}.log">

        <Policies>
            <TimeBasedTriggeringPolicy interval="2"></TimeBasedTriggeringPolicy>
        </Policies>
        <JsonLayout eventEol="true" compact="true"></JsonLayout>
        <CustomStrategy />
</RollingFile>
...

Я написал класс CustomStrategy, который расширяет DefaultRolloverStrategy, а затем переопределил метод rollover следующим образом:

@Override
public RolloverDescription rollover(final RollingFileManager manager) throws SecurityException {

        RolloverDescription temp = super.rollover(manager);

        //Read file that just got rolled over and do some stuff

        return temp;
    }

В этом методе мне нужно имя файла, который только что был пролонгирован, то есть изначально журналы записываются в temp.log, а затем переносятся в test1-[some timestamp], чтобы прочитать его и выполнить определенные операции. Кто-нибудь может подсказать, как получить имя файла (test1-[some timestamp])?

1 Ответ

0 голосов
/ 14 ноября 2018

Свернутый файл фактически находится в AsyncAction временной переменной в вашем коде. Вы можете получить нужные данные, используя некоторые java отражения. Если вы используете log4j2.6 или выше, temp.getAsynchronous () возвращает список CompositeActions , который вам нужно перебрать, чтобы найти ZipCompressAction.

Action asyncAction = temp.getAsynchronous();
ZipCompressAction zipCompressAction = asyncAction instanceof GzCompressAction ? (ZipCompressAction) asyncAction : null; // Or GzCompressAction - depends on your configuration

Field destination;
File destinationFile = null;

if (zipCompressAction != null) {
    try {
        destination = zipCompressAction.getClass().getDeclaredField("destination");
        Object destinationObject = ReflectionUtil.getFieldValue(destination, gzCompressAction);
        destinationFile = destinationObject instanceof File ? (File) destinationObject : null;
    } catch (Exception e) {
        destinationFile = null;
    }
}
...