java - name - logback pattern
¿Es posible configurar los niveles de logger logback en la línea de comandos? (3)
Log4J le permite pasar el nivel en el que le gustaría que registradores particulares de su aplicación inicien sesión desde la línea de comandos, por ejemplo, "-Dlog4j.logger.com.whatever.MyClass = DEBUG". No puedo encontrar ninguna instalación similar en Logback. De acuerdo con las Preguntas frecuentes, todo lo que parece permitirte hacer es establecer el nivel para el registrador raíz mediante la sustitución de variables. ¿Hay algo que me falta o Logback simplemente no admite esto? Gracias.
Como se indica en las FAQ :
Logback no permite deshabilitar el registro desde la línea de comandos. Sin embargo, si el archivo de configuración lo permite, puede establecer el nivel de registradores en la línea de comandos a través de una propiedad del sistema Java.
Entonces, como @kan mencionó anteriormente, tienes que usar otras opciones.
Sé que esta es una pregunta antigua, pero aquí está mi código de solución para inicializar los niveles de Logback Logger desde SysProps, si alguien lo necesita. Tenga en cuenta que recupera el Logback Logger utilizando el LoggerFactory de Slf4j. Utiliza un lambda de Java 8, pero podría traducirse fácilmente a Java 7 o menos.
Solo tiene que agregar SysPropLogbackConfigurator.applyOnce()
al inicio de su método main
. Si se llama varias veces, el inicializador estático evitará volver a escanear las propiedades.
package com.yourpackage;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
/**
* Looks into System.properties for props -DLOG.loggerName=LEVEL to set Logback levels at startup
* If LEVEL is empty (setting -DLOG.loggerName without level), it erases a previously set level and will inherit from parent logger
*/
public class SysPropLogbackConfigurator {
public static final String PROP_PREFIX = "LOG.";
public static void apply() {
System.getProperties().stringPropertyNames().stream().filter(name -> name.startsWith(PROP_PREFIX)).forEach(SysPropLogbackConfigurator::applyProp);
}
public static void applyOnce() {
OnceInitializer.emptyMethodToForceInit();//force static init. applySysPropsToLogback will be called only once
}
private static void applyProp(final String name) {
final String loggerName = name.substring(PROP_PREFIX.length());
final String levelStr = System.getProperty(name, "");
final Level level = Level.toLevel(levelStr, null);
((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(loggerName)).setLevel(level);
}
private static class OnceInitializer {
static {
apply();
}
static void emptyMethodToForceInit() {
};
}
}
Sí, parece que no hay tal característica. Según tengo entendido, esto se debe en parte a que la configuración de logback es más compleja, por lo que es bastante difícil lograr una flexibilidad de configuración razonable mediante las propiedades de cadena plana. En parte porque, imho, alienta las malas prácticas (colocar demasiadas propiedades del sistema) lleva a ejecutar scripts de ejecución o líneas de comando, más difíciles de administrar que los archivos de configuración de registro separados.
Sin embargo, podría sugerir varias opciones:
- use las sustituciones de
${sys.prop.var.name}
en su archivo de configuración logback.xml - copie logback.xml localmente, modifíquelo con los niveles de registrador deseados y especifique
-Dlogback.configurationFile=/path/to/customised/logback.xml
. Tenga en cuenta que "Logback-classic puede buscar cambios en su archivo de configuración y reconfigurarse automáticamente cuando cambie el archivo de configuración". Por lo tanto, incluso no es necesario reiniciar el proceso para cambiar los niveles de registro. - DIY: agregue un código en su aplicación que lea las propiedades del sistema y aplique las propiedades a los niveles de registro durante el inicio.