Как настроить log4j2 RollingFileAppender?
Мы используем log4j 1.2.x для входа в наш продукт и планируем перейти на log4j 2.x в ближайшем будущем. Одна из реализованных нами функциональных возможностей заключается в том, чтобы регистрировать системную информацию и другие важные параметры в каждом новом генерируемом лог-файле пролонгации. В log4j 1.2.x мы реализовали то, что мы расширилиRollingFileAppender
класс log4j и переопределилrollOver()
ниже приведен фрагмент кода реализации
@Override
public void rollOver() {
super.rollOver(); //We are not modifying it's default functionality but as soon as rollOver happens we apply our logic
//
// Logic to log required system properties and important parameters.
//
}
Теперь, когда мы хотим перейти на log4j2, мы ищем новое решение для достижения той же функциональности. Но, как я вижу исходный код для log4j2, он сильно отличается от старого исходного кода.RollingFileAppender
класс не содержитrollover()
метод, как он был перемещен вRollingManagerhelper
и было установленоprivate
также.
Разработка полного нового пакета и расширение / реализация некоторых абстрактных / вспомогательных классов из log4j2 является одним из возможных решений для нас, но это потребует большого количества кодирования / копирования, поскольку мы не изменяем то, чтоRollingFileAppender
скорее нам нужно только небольшое расширение к нему. Есть ли простое решение для этого?
ОБНОВИТЬ
Я создал пользовательский поиск в соответствии с предложением в ответах и ниже, как я его создал;
@Plugin(name = "property", category = StrLookup.CATEGORY)
public class CustomLookup extends AbstractLookup {
private static AtomicLong aLong = new AtomicLong(0);
@Override
public String lookup(LogEvent event, String key) {
if (aLong.getAndIncrement() == 0) {
return "this was first call";
}
if (key.equalsIgnoreCase("customKey")) {
return getCustomHeader();
} else {
return "non existing key";
}
}
private static String getCustomHeader() {
// Implementation of custom header
return "custom header string";
}}
Но это не сработало, как упоминалось; это всегда печатаетthis was first call
в шапке. Я также попытался поставить перерыв на первомif
и что я заметил, так это то, что он вызывается только один раз. Так что я боюсь, что класс customLookup инициализируется только при запуске, когда log4j2 инициализирует свои свойства из конфигурации xml. Я не знаю, как еще я мог реализовать этот пользовательский класс поиска.
ОБНОВЛЕНИЕ 2
После вышеупомянутой реализации я попробовал это немного по-другому, как показано ниже;
private static AtomicLong aLong = new AtomicLong(0);
@Override
public String lookup(LogEvent event, String key) {
return getCustomHeader(key);
}
private static String getCustomHeader(final String key) {
if (aLong.getAndIncrement() == 0) {
return "this was first call";
}
if (key.equalsIgnoreCase("customKey")) {
// Implementation for customKey
return "This is custom header";
} else {
return "non existing key";
}
}
Но это делает то же самое, что и хорошо. log4j2 создает заголовки при инициализации из своего конфигурационного файла xml, а затем использует заголовки из памяти.return
значение переопределеноlookup()
метод не может быть изменен динамически, так как он вызывается только во время инициализации. Любая дополнительная помощь будет высоко ценится.