¿Cuáles son los diferentes enfoques para cambiar el nivel de registro log4j dinámicamente, para que no tenga que volver a implementar la aplicación? ¿Los cambios serán permanentes en esos casos?
¿Cuáles son los diferentes enfoques para cambiar el nivel de registro log4j dinámicamente, para que no tenga que volver a implementar la aplicación? ¿Los cambios serán permanentes en esos casos?
Respuestas:
Cambiar el nivel de registro es simple; modificar otras partes de la configuración planteará un enfoque más profundo.
LogManager.getRootLogger().setLevel(Level.DEBUG);
Los cambios son permanentes a través del ciclo de vida del Logger
. En la reinicialización, la configuración se leerá y utilizará, ya que establecer el nivel en tiempo de ejecución no persiste el cambio de nivel.
ACTUALIZACIÓN: Si está utilizando Log4j 2, debe eliminar las llamadas setLevel
según la documentación, ya que esto se puede lograr a través de clases de implementación.
Las llamadas a logger.setLevel () o métodos similares no son compatibles con la API. Las aplicaciones deben eliminar estos. Se proporciona una funcionalidad equivalente en las clases de implementación de Log4j 2, pero puede hacer que la aplicación sea susceptible a cambios en las partes internas de Log4j 2.
LogManager.getLogger(Class.forName("org.hibernate.util.JDBCExceptionReporter")).setLevel(Level.FATAL);
Log4j puede ver el log4j.xml
archivo en busca de cambios de configuración. Si cambia el archivo log4j, log4j actualizará automáticamente los niveles de registro de acuerdo con sus cambios. Consulte la documentación de org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long
) para más detalles. El tiempo de espera predeterminado entre verificaciones es de 60 segundos. Estos cambios serían persistentes, ya que cambia directamente el archivo de configuración en el sistema de archivos. Todo lo que necesita hacer es invocar DOMConfigurator.configureAndWatch () una vez.
Precaución: el método configureAndWatch no es seguro para su uso en entornos J2EE debido a una fuga de hilo
Otra forma de establecer el nivel de registro (o la reconfiguración en general) log4j es mediante JMX. Log4j registra sus registradores como JMX MBeans. Usando las consolas MBeanServer de los servidores de aplicaciones (o jconsole.exe de JDK) puede reconfigurar cada registrador individual. Estos cambios no son persistentes y se restablecerán a la configuración establecida en el archivo de configuración después de reiniciar su aplicación (servidor).
Según lo descrito por Aaron, puede establecer el nivel de registro mediante programación. Puede implementarlo en su aplicación de la forma en que le gustaría que sucediera. Por ejemplo, podría tener una GUI donde el usuario o administrador cambie el nivel de registro y luego llame a los setLevel()
métodos en el registrador. Si persiste la configuración en algún lugar o no, depende de usted.
Log4j2 se puede configurar para actualizar su configuración escaneando el archivo log4j 2 .xml (o equivalente) a intervalos determinados. Simplemente agregue el parámetro " monitorInterval " a su etiqueta de configuración. Consulte la línea 2 del archivo de ejemplo log4j 2 .xml, que le dice a log4j que vuelva a escanear su configuración si han pasado más de 5 segundos desde el último evento de registro.
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="warn" monitorInterval="5" name="tryItApp" packages="">
<Appenders>
<RollingFile name="MY_TRY_IT"
fileName="/var/log/tryIt.log"
filePattern="/var/log/tryIt-%i.log.gz">
<Policies>
<SizeBasedTriggeringPolicy size="25 MB"/>
</Policies>
...
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MY_TRY_IT"/>
</Root>
</Loggers>
</Configuration>
Hay pasos adicionales para hacer que esto funcione si está implementando en una instancia de tomcat, dentro de un IDE o cuando usa el arranque de primavera. Esto parece algo fuera de alcance aquí y probablemente merece una pregunta por separado.
Esta respuesta no lo ayudará a cambiar el nivel de registro dinámicamente, debe reiniciar el servicio, si está bien reiniciando el servicio, utilice la solución a continuación
Hice esto para cambiar el nivel de registro log4j y funcionó para mí, no he referido ningún documento. Utilicé este valor de propiedad del sistema para establecer mi nombre de archivo de registro. También utilicé la misma técnica para establecer el nivel de registro, y funcionó
pasó esto como parámetro JVM (uso Java 1.7)
Lo sentimos, esto no cambiará dinámicamente el nivel de registro, requiere un reinicio del servicio
java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java
en el archivo log4j.properties, agregué esta entrada
log4j.rootLogger=${logging.level},file,stdout
Lo intenté
java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java
java -Dlogging.level=INFO-cp xxxxxx.jar xxxxx.java
java -Dlogging.level=OFF -cp xxxxxx.jar xxxxx.java
Todo funcionó. ¡espero que esto ayude!
Tengo estas siguientes dependencias en mi pom.xml
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>apache-log4j-extras</artifactId>
<version>1.2.17</version>
</dependency>
Con log4j 1.x, encuentro que la mejor manera es usar un DOMConfigurator para enviar uno de un conjunto predefinido de configuraciones de registro XML (por ejemplo, uno para uso normal y otro para depuración).
Hacer uso de estos se puede hacer con algo como esto:
public static void reconfigurePredefined(String newLoggerConfigName) {
String name = newLoggerConfigName.toLowerCase();
if ("default".equals(name)) {
name = "log4j.xml";
} else {
name = "log4j-" + name + ".xml";
}
if (Log4jReconfigurator.class.getResource("/" + name) != null) {
String logConfigPath = Log4jReconfigurator.class.getResource("/" + name).getPath();
logger.warn("Using log4j configuration: " + logConfigPath);
try (InputStream defaultIs = Log4jReconfigurator.class.getResourceAsStream("/" + name)) {
new DOMConfigurator().doConfigure(defaultIs, LogManager.getLoggerRepository());
} catch (IOException e) {
logger.error("Failed to reconfigure log4j configuration, could not find file " + logConfigPath + " on the classpath", e);
} catch (FactoryConfigurationError e) {
logger.error("Failed to reconfigure log4j configuration, could not load file " + logConfigPath, e);
}
} else {
logger.error("Could not find log4j configuration file " + name + ".xml on classpath");
}
}
Simplemente llame a esto con el nombre de configuración apropiado y asegúrese de colocar las plantillas en el classpath.
He utilizado este método con éxito para reducir la verbosidad de los registros "org.apache.http":
ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.apache.http");
logger.setLevel(Level.TRACE);
logger.setAdditive(false);
Para log4j 2 API, puede usar
Logger logger = LogManager.getRootLogger();
Configurator.setAllLevels(logger.getName(), Level.getLevel(level));
Si desea cambiar el nivel de registro de todos los registradores, utilice el siguiente método. Esto enumerará todos los registradores y cambiará el nivel de registro a un nivel dado. Asegúrese de que NO tiene una log4j.appender.loggerName.Threshold=DEBUG
propiedad establecida en su log4j.properties
archivo.
public static void changeLogLevel(Level level) {
Enumeration<?> loggers = LogManager.getCurrentLoggers();
while(loggers.hasMoreElements()) {
Logger logger = (Logger) loggers.nextElement();
logger.setLevel(level);
}
}
Puede usar el siguiente fragmento de código
((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));