sl4j pattern loggerfactory logger how example debug java logging slf4j

java - pattern - sl4j y logback-¿Es posible establecer mediante programación el nivel de registro para el paquete?



slf4j loggerfactory (4)

Debe establecer el nombre del paquete como logger-name

// Sets the package level to INFO LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory(); Logger rootLogger = loggerContext.getLogger("com.somepackage"); rootLogger.setLevel(Level.INFO);

Debería poder obtener el nombre del paquete más elegante, pero esto es básicamente eso. Esto sigue la jerarquía en forma de árbol para el contexto del registrador : Contexto del registrador

Puedo establecer el nivel de registro en la aplicación mediante programación con el siguiente código, pero también es posible hacerlo a nivel de paquete , por ejemplo, com.somepackage. * Donde quiero que el nivel sea solo ERROR en lugar de DEBUG o ¿INFO sobre dicho paquete?

// Sets the logging level to INFO LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory(); Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); rootLogger.setLevel(Level.INFO);

Pero parece que no puedo encontrar una manera de configurarlo a nivel de paquete ...


En caso de que no quiera cambiar el clásico de logback a una dependencia en tiempo de compilación, aquí hay un código que usa la reflexión para establecer este nivel, asumiendo que el logback se usa como el enlace de tiempo de ejecución slf4j. Aquí AbcClass es la clase cuyo nivel de registrador desea cambiar a TRACE :

import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SomeClass { private static final Logger logger = LoggerFactory.getLogger(SomeClass .class); public static void beforeEachTest() throws Exception { final Logger loggerInterface = LoggerFactory.getLogger(AbcClass.class); String loggerLevelNew = "TRACE"; if (!loggerInterface.isTraceEnabled()) { try { Class<?> levelLogBackClass = Class.forName("ch.qos.logback.classic.Level"); Method toLevelMethod = levelLogBackClass.getDeclaredMethod("toLevel", String.class); Object traceLvel = toLevelMethod.invoke(null, loggerLevelNew); Method loggerSetLevelMethod= loggerInterface.getClass().getDeclaredMethod("setLevel", levelLogBackClass); loggerSetLevelMethod.invoke(loggerInterface, traceLvel); } catch (Exception e) { logger.warn("Problem setting logger level to:{}, msg: {}", loggerLevelNew, e.getMessage()); throw e; } } } }

Se puede hacer algo similar para log4j y el registro JDK para hacer que este (tipo de) biblioteca sea agnóstico


Puede obtener el registrador SLF4J para el paquete y convertirlo en el registrador Logback. Menos código que @dimitri-dewaele''s.

((Logger) LoggerFactory.getLogger("com.somepackage")).setLevel(DEBUG)

El enfoque de @ nandu-prajapati es similar, excepto que establece el nivel del registrador raíz, no el deseado.


Puedes hacerlo usando logback ..

Logger LOG = (Logger) org.slf4j.LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); LOG.setLevel(Level.WARN);

Esto solucionó mi problema.