Estoy tratando de usar SLF4J (con log4j
enlace) por primera vez.
Me gustaría configurar 3 Loggers con nombre diferentes que pueden ser devueltos por un LoggerFactory que registrará diferentes niveles y enviará los mensajes a diferentes apéndices:
- Logger 1 "FileLogger" registra DEPURACIÓN y se agrega a
DailyRollingFileAppender
- Logger 2 "TracingLogger" registra TRACE + y se agrega a un
JmsAppender
- Logger 3 "ErrorLogger" registra ERROR + y se agrega a un archivo diferente
JmsAppender
Además, los quiero configurados mediante programación (en Java, a diferencia de XML o un log4j.properties
archivo).
Me imagino que, normalmente, definiría estos Logger
s en algún lugar de algún código de arranque, como un init()
método. Sin embargo, debido a que quiero usar slf4j-log4j
, estoy confundido acerca de dónde podría definir los registradores y ponerlos a disposición del classpath.
No creo que esto sea una violación del propósito subyacente de SLF4J (como fachada), porque mi código que usa la API SLF4J nunca sabrá que existen estos registradores. Mi código solo realiza llamadas normales a la API SLF4J, que luego las reenvía a los Log4j Loggers que encuentra en el classpath.
¿Pero cómo configuro esos Log4j Loggers en el classpath ... en Java?
Respuestas:
Puede agregar / eliminar Appender mediante programación a Log4j:
Te sugiero que lo pongas en un init () en algún lugar, donde estés seguro, de que esto se ejecutará antes que nada. Luego puede eliminar todos los apéndices existentes en el registrador raíz con
y comience agregando los suyos. Necesita log4j en el classpath, por supuesto, para que esto funcione.
Observación:
puede tomar cualquiera que
Logger.getLogger(...)
desee para agregar apéndices. Acabo de tomar el registrador raíz porque está en la parte inferior de todas las cosas y manejará todo lo que se pasa a través de otros anexos en otras categorías (a menos que se configure de otra manera configurando el indicador de aditividad).Si necesita saber cómo funciona el registro y cómo se decide dónde se escriben los registros, lea este manual para obtener más información al respecto.
En breve:
le dará un registrador para la categoría "com.fizz".
Para el ejemplo anterior, esto significa que todo lo registrado con él se referirá a la consola y al archivo adjunto en el registrador raíz.
Si agrega un appender a Logger.getLogger ("com.fizz"). AddAppender (newAppender), entonces el inicio de sesión
fizz
será manejado por alle los appenders del registrador raíz y elnewAppender
.No crea registradores con la configuración, solo proporciona controladores para todas las categorías posibles en su sistema.
fuente
Logger fizz = LoggerFactory.getLogger("com.fizz");
¡gracias!Parece que está intentando utilizar log4j desde "ambos extremos" (el consumidor final y el final de la configuración).
Si desea codificar contra la API slf4j pero determinar con anticipación (y mediante programación) la configuración de los Log4j Loggers que el classpath devolverá, absolutamente debe tener algún tipo de adaptación de registro que haga uso de la construcción perezosa.
Con este enfoque, no necesita preocuparse acerca de dónde / cuándo se configuran sus registradores log4j. La primera vez que el classpath pregunta por ellos, se construyen perezosamente, se devuelven y se ponen a disposición a través de slf4j. Espero que esto haya ayudado!
fuente
En el caso de que haya definido un apéndice en las propiedades de log4j y desee actualizarlo mediante programación, establezca el nombre en las propiedades de log4j y obtenga el nombre.
Aquí hay una entrada de ejemplo log4j.properties:
Para actualizarlo, haga lo siguiente:
fuente
Si alguien viene buscando configurar log4j2 mediante programación en Java, entonces este enlace podría ayudar: ( https://www.studytonight.com/post/log4j2-programmatic-configuration-in-java-class )
Aquí está el código básico para configurar un Appender de consola:
Esto reconfigurará el rootLogger predeterminado y también creará un nuevo apéndice .
fuente