Log4j 1.2 - 2.17.2 bridge e configuração legada
As recentes vulnerabilidades de dia zero do log4j2 causaram um grande alvoroço no mundo Java. Certamente, as empresas de software começaram a se interessar mais pelas dependências que utilizam em seus produtos. Atualmente, podemos desfrutar de duas versões seguras do log4j, a 2.17.1 e a 2.17.2. No entanto, alguns produtos legados ainda usam a versão 1.2 do log4j, que chegou ao fim de sua vida útil (EOL) em 2015. Além disso, alguns nem mesmo usam a fachada slf4j.
No processo de correção de segurança, você pode optar por substituir a 1.2 pela biblioteca reload4j, que contém as mesmas classes corrigidas para bugs críticos. Contudo, a abordagem mais respeitável é migrar completamente para o log4j2. A terceira opção é um meio-termo: usar a ponte log4j-1.2-api, que expõe a API antiga conectando-se com o núcleo da versão 2.
Além da API, o log4j2 introduziu suporte à configuração antiga já na versão 2.13.3. É preciso ter cuidado, pois nem todos os itens de configuração eram totalmente suportados. Isso é especialmente verdade quando combinado com appenders personalizados como o apache-log4j-extras (que, aliás, contém um subconjunto de classes da 1.2, tornando seu uso um tanto questionável).
Nota: Há algumas melhorias promissoras a serem introduzidas na versão 2.18 para suportar mais elementos de configuração do apache-extras, como o org.apache.log4j.
rolling.RollingFileAppender.
Com isso em mente, você pode atualizar a configuração ou torcer para reutilizar a antiga, se ela for totalmente suportada. Uma coisa a notar são as melhorias implementadas na 2.17.2 em comparação com a 2.17.1. Antes, a forma programática de carregar a configuração através da ponte era uma operação nula (no-op). A 2.17.2, além de várias correções, também muda esse comportamento.
Se você ainda tem algum código que carrega a configuração usando a API 1.2, por exemplo, assim:
DOMConfigurator.configure(filename);
DOMConfigurator.configureAndWatch(configFilename, delay);
Você pode encontrar alguns erros infelizes. Como mencionado nos documentos de migração, isso não é permitido, mas até a versão 2.17.1, não tinha efeitos negativos. Na 2.17.2, ele tentará carregar a configuração 1.x, afetando sua abordagem de atualização se você usar esta interface:
public class DOMConfigurator {
//2.17.1:
public static void configureAndWatch(final String configFilename, final long delay) {
}
//2.17.2:
public static void configureAndWatch(final String fileName, final long delay) {
XMLWatchdog xdog = new XMLWatchdog(fileName);
xdog.setDelay(delay);
xdog.start();
}
//...
}
Quando se trata das propriedades do sistema, a propriedade log4j.configurationFile conhecida do log4j2 é a fonte preferida de configuração ao usar a ponte.
Você pode usar a propriedade legada 1.x log4j.configuration ao mesmo tempo e fazer a transição para o novo formato sem problemas.
