Como personalizar o log4j2 RollingFileAppender?
Usamos o log4j 1.2.x para efetuar logon em nosso produto e pretendemos migrar para o log4j 2.x em um futuro próximo. Uma das funcionalidades que implementamos é registrar as informações do sistema e outros parâmetros de importação e ant em cada novo arquivo de log de rollover que é gerado. A maneira como implementamos no log4j 1.2.x é que estendemosRollingFileAppender
classe de log4j e substituíram orollOver()
método, abaixo está o trecho da parte da implementação
@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.
//
}
Agora, como queremos migrar para o log4j2, estamos procurando uma nova solução para obter a mesma funcionalidade. Mas, como vejo o código fonte do log4j2, é muito diferente do código fonte mais antigo. oRollingFileAppender
classe não contémrollover()
método como foi movido paraRollingManagerhelper
e foi definido comoprivate
também.
Desenvolver um novo pacote completo e estender / implementar algumas classes abstract / helper do log4j2 é uma das soluções possíveis para nós, mas isso exigiria muita codificação / cópia, pois não modificamos o queRollingFileAppender
ao contrário, precisamos apenas de uma pequena extensão. Existe uma solução simples para isso?
ATUALIZAR
Eu criei uma pesquisa personalizada de acordo com a sugestão nas respostas e abaixo é como eu a criei;
@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";
}}
Mas isso não funcionou como mencionado; isso sempre imprimethis was first call
no cabeçalho. Eu também tentei colocar breakoint no primeiroif
condição e o que notei foi que ele só é chamado uma vez. Então, o que eu temo é que a classe customLookup seja inicializada apenas na inicialização quando o log4j2 estiver inicializando suas propriedades a partir da configuração xml. Não sei de que outra forma eu poderia implementar essa classe de pesquisa personalizada.
ATUALIZAÇÃO 2
Após a implementação acima, tentei de maneira um pouco diferente, como abaixo;
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";
}
}
Mas isso faz a mesma coisa também. O log4j2 cria os cabeçalhos durante a inicialização do arquivo de configuração xml e, em seguida, usa os cabeçalhos da memória. oreturn
valor de substituídolookup()
O método não pode ser alterado dinamicamente, pois é chamado apenas durante a inicialização. Mais alguma ajuda seria muito apreciada.