log4java - ¿Cómo agregar programadores Log4J2 en tiempo de ejecución mediante programación?
log4j2 properties example (5)
Como señalé anteriormente, no pude hacer que https://logging.apache.org/log4j/2.x/manual/customconfig.html#AddingToCurrent funcione, al menos, no de la forma que esperaba (mi appender lo haría nunca obtener mensajes enrutados a ella). Finalmente, me topé con un patrón que me funciona, permitiéndome agregar un appender en tiempo de ejecución, y hacer que ese appender realmente reciba los mensajes de registro enrutados.
Editar Quité un montón de código confuso de aquí que no estaba haciendo nada ...
LoggerContext lc = (LoggerContext) LogManager.getContext(false);
FileAppender fa = FileAppender.newBuilder().withName("mylogger").withAppend(false).withFileName(new File(outputDirectory, "ConsoleOutput.txt").toString())
.withLayout(PatternLayout.newBuilder().withPattern("%-5p %d [%t] %C{2} (%F:%L) - %m%n").build())
.setConfiguration(lc.getConfiguration()).build();
fa.start();
lc.getConfiguration().addAppender(fa);
lc.getRootLogger().addAppender(lc.getConfiguration().getAppender(fa.getName()));
lc.updateLoggers();
Un punto clave para mí, fue que llamar a addAppender y pasar directamente a tu appender no funciona, pero parece que pedirle a tu appender que vuelva por su nombre. Lo cual no tiene sentido ... pero ya que estoy trabajando, y estoy cansado de perder el tiempo en algo que debería ser tan simple ...
¿Es posible agregar agregadores Log4J2 mediante programación utilizando las especificaciones de la configuración XML?
Planeo definirlo todo en el log4j2.xml y luego seleccionar a los agregadores de manera situacional como esto (no compilaré):
if (arg[0].equals("log") ) {
Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig");
} else {
//...
}
Edición: para las versiones más recientes de log4j2, consulte https://.com/a/33472893/1899566 lugar.
Me da la impresión de que no quieren que hagas esto, pero esto funciona para mí:
if (arg[0].equals("log") ) {
org.apache.logging.log4j.Logger logger
= org.apache.logging.log4j.LogManager.getLogger("loggerNameFromXMLConfig");
org.apache.logging.log4j.core.Logger coreLogger
= (org.apache.logging.log4j.core.Logger)logger;
org.apache.logging.log4j.core.LoggerContext context
= (org.apache.logging.log4j.core.LoggerContext)coreLogger.getContext();
org.apache.logging.log4j.core.config.BaseConfiguration configuration
= (org.apache.logging.log4j.core.config.BaseConfiguration)context.getConfiguration();
coreLogger.addAppender(configuration.getAppender("appenderNameFromXMLConfig"));
} else {
//...
}
En la estructura log4j2
---"Config"---
Appenders
Appender(0)
Console
Appender(1)
File
LoggerConfigs
-- LoggerConfig(0)
-- LoggerConfig(1)
-- LoggerConfig(2)
----"LoggerConfig"----
- AppenderRefs
-- AppenderRef(0)
-- Name Console
-- Level : DEBUG
- Appenders
-- Appender(0)
-- Name Console
-- Level : DEBUG
- Level -- ALL
loggerConfig.getAppenders () -> Devolverá los Anexos en "Config". Para mi esto es un error
loggerConfig.getAppenderRefs () -> está funcionando bien !!
Ha habido una serie de solicitudes para admitir una mejor configuración programática para Log4j 2. Lo siento, tomó tanto tiempo. A partir de Log4j 2.4, la API se agregó a log4j-core para facilitar la configuración programática .
La nueva API de ConfigurationBuilder
permite a los usuarios construir definiciones de componentes. Con esta API, no es necesario trabajar directamente con objetos de configuración reales (como LoggerConfig y FileAppender) que requieren un gran conocimiento de cómo funciona Log4j bajo el capó. Las definiciones de los componentes se agregan a ConfigurationBuilder, y una vez que se han recopilado todas las definiciones, se construyen todos los objetos de configuración reales (como los registradores y los agregadores). Se siente un poco como la sintaxis de configuración XML, excepto que estás escribiendo código Java.
Tenga en cuenta que la nueva API de ConfigurationBuilder
permite al código de usuario crear una nueva configuración o reemplazar completamente la configuración existente. Si su caso de uso es diferente, y desea modificar mediante programación (en lugar de reemplazar) una configuración existente después de iniciar Log4j, deberá trabajar con objetos de configuración reales. En ese caso, consulte la sección Modificación de la configuración actual después de la inicialización mediante programación del manual.
No sé si es útil: se puede agregar un Appender a un registrador llamando al método addLoggerAppender de la Configuración actual. referencia: http://logging.apache.org/log4j/2.x/manual/architecture.html