Estou tentando usar SLF4J (com log4j
ligação) pela primeira vez.
Gostaria de configurar três loggers nomeados diferentes que podem ser retornados por um LoggerFactory que registrará níveis diferentes e enviará as mensagens para diferentes anexos:
- Registrador 1 "FileLogger" registra DEBUG e anexa a
DailyRollingFileAppender
- O registrador 2 "TracingLogger" registra TRACE + e anexa a um
JmsAppender
- O registrador 3 "ErrorLogger" registra o erro + e anexa a um
JmsAppender
Além disso, eu quero que eles sejam configurados programaticamente (em Java, em vez de XML ou um log4j.properties
arquivo).
Eu imagino que, normalmente, eu definiria esses Logger
s em algum lugar de algum código de inicialização, como um init()
método. No entanto, como quero usar slf4j-log4j
, estou confuso sobre onde eu poderia definir os criadores de logs e disponibilizá-los para o caminho de classe.
Não acredito que isso seja uma violação do objetivo subjacente do SLF4J (como fachada), porque meu código usando a API do SLF4J nunca saberá que esses registradores existem. Meu código apenas faz chamadas normais para a API SLF4J, que as encaminha para os log4j Loggers que encontra no caminho de classe.
Mas como faço para configurar esses log4j Loggers no caminho de classe ... em Java ?!
Respostas:
Você pode adicionar / remover Appender programaticamente no Log4j:
Eu sugiro que você o coloque em um init () em algum lugar, onde você tenha certeza, que isso será executado antes de qualquer outra coisa. Você pode remover todos os anexos existentes no registrador raiz com
e comece adicionando o seu. Você precisa do log4j no caminho da classe para que isso funcione.
Observação:
você pode
Logger.getLogger(...)
adicionar o que quiser para adicionar anexos. Acabei de usar o registrador raiz porque ele está na parte inferior de todas as coisas e lidará com tudo o que é passado por outros apêndices em outras categorias (a menos que configurado de outra forma, definindo o sinalizador de aditividade).Se você precisar saber como o registro funciona e como é decidido onde os registros são gravados, leia este manual para obter mais informações sobre isso.
Em resumo:
lhe dará um logger para a categoria "com.fizz".
Para o exemplo acima, isso significa que tudo o que estiver conectado a ele será consultado no console e no apêndice do arquivo no registrador raiz.
Se você adicionar um appender ao Logger.getLogger ("com.fizz"). AddAppender (newAppender), o log
fizz
será processado por todos os anexos do logger raiz e donewAppender
.Você não cria registradores com a configuração, apenas fornece manipuladores para todas as categorias possíveis no seu sistema.
fonte
Logger fizz = LoggerFactory.getLogger("com.fizz");
obrigado , obrigado!Parece que você está tentando usar o log4j de "ambas as extremidades" (a extremidade do consumidor e a extremidade da configuração).
Se você deseja codificar contra a slf4j api, mas determinar antecipadamente (e programaticamente) a configuração dos log4j Loggers que o caminho de classe retornará, é absolutamente necessário ter algum tipo de adaptação de log que utilize construção lenta.
Com essa abordagem, você não precisa se preocupar com onde / quando os loggers do log4j são configurados. Na primeira vez em que o caminho da classe pede, eles são construídos preguiçosamente, devolvidos e disponibilizados via slf4j. Espero que isso tenha ajudado!
fonte
No caso de você ter definido um appender nas propriedades do log4j e desejar atualizá-lo programaticamente, defina o nome nas propriedades do log4j e obtenha-o pelo nome.
Aqui está um exemplo de entrada log4j.properties:
Para atualizá-lo, faça o seguinte:
fonte
Se alguém procurar configurar o log4j2 programaticamente em Java, esse link poderá ajudar: ( https://www.studytonight.com/post/log4j2-programmatic-configuration-in-java-class )
Aqui está o código básico para configurar um Console Appender:
Isso reconfigurará o rootLogger padrão e também criará um novo aplicativo .
fonte