Je suis capable de définir par programme le niveau de journalisation sur l'application avec le code suivant, mais est-il également possible de le faire au niveau d'un package, dites com.somepackage. * Où je veux que le niveau être seulement ERREUR plutôt que DEBUG ou INFO sur ledit paquet?
// Sets the logging level to INFO
LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.setLevel(Level.INFO);
Mais je n'arrive pas à trouver un moyen de le définir au niveau du package ...
Vous devez définir le nom du package comme logger-name
// Sets the package level to INFO
LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
Logger rootLogger = loggerContext.getLogger("com.somepackage");
rootLogger.setLevel(Level.INFO);
Vous devriez être en mesure d'obtenir le nom du package plus élégant, mais c'est essentiellement cela. Cela suit l'arborescence comme la hiérarchie pour le contexte de l'enregistreur: Contexte de l'enregistreur
Vous pouvez le faire en utilisant la déconnexion.
Logger LOG = (Logger) org.slf4j.LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
LOG.setLevel(Level.WARN);
Cela a résolu mon problème.
Vous pouvez obtenir l'enregistreur SLF4J pour le package et le caster dans l'enregistreur Logback. Moins de code que @ dimitri-dewaele.
((Logger) LoggerFactory.getLogger("com.somepackage")).setLevel(DEBUG)
L'approche de @ nandu-prajapati est similaire, sauf qu'elle définit le niveau de l'enregistreur racine, pas celui souhaité.
Dans le cas où vous ne voulez pas changer le logback-classic en une dépendance au moment de la compilation, voici un code qui utilise la réflexion pour définir ce niveau en supposant que logback est utilisé comme liaison d'exécution slf4j. Ici AbcClass est la classe dont vous voulez changer le niveau d'enregistreur 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;
}
}
}
}
Quelque chose de similaire peut être fait pour la journalisation log4j et JDK pour rendre cette (sorte de) bibliothèque agnostique