Lors de l'utilisation de log4j, la Logger.log(Priority p, Object message)
méthode est disponible et peut être utilisée pour consigner un message à un niveau de journal déterminé lors de l'exécution. Nous utilisons ce fait et cette astuce pour rediriger stderr vers un enregistreur à un niveau de journal spécifique.
slf4j n'a pas de log()
méthode générique que je puisse trouver. Cela signifie-t-il qu'il n'y a aucun moyen de mettre en œuvre ce qui précède?
slf4j 2.0
. jira.qos.ch/browse/SLF4J-124 Voir ma réponse pour plus de détails et pour uneslf4j 1.x
solution de contournement possible .Réponses:
Il n'y a aucun moyen de faire cela avec
slf4j
.J'imagine que la raison pour laquelle cette fonctionnalité est manquante est qu'il est pratiquement impossible de construire un
Level
type pourslf4j
qui peut être mappé efficacement au typeLevel
(ou équivalent) utilisé dans toutes les implémentations de journalisation possibles derrière la façade. Alternativement, les concepteurs ont décidé que votre cas d'utilisation était trop inhabituel pour justifier les frais généraux liés à sa prise en charge.Concernant le cas d' utilisation de @ ripper234 (tests unitaires), je pense que la solution pragmatique est de modifier le (s) test (s) unitaire pour connaître en dur le système de journalisation derrière la façade slf4j ... lors de l'exécution des tests unitaires.
la source
org.slf4j.Logger
: debug, error, info, trace, warn.Richard Fearn a la bonne idée, alors j'ai rédigé le cours complet en me basant sur son squelette de code. J'espère que c'est assez court pour être publié ici. Copiez et collez pour le plaisir. Je devrais probablement ajouter une incantation magique aussi: "Ce code est publié dans le domaine public"
la source
Essayez de passer à Logback et utilisez
Je crois que ce sera le seul appel à Logback et le reste de votre code restera inchangé. Logback utilise SLF4J et la migration sera sans problème, seuls les fichiers de configuration xml devront être modifiés.
N'oubliez pas de redéfinir le niveau de journalisation une fois que vous avez terminé.
la source
Vous pouvez l'implémenter à l'aide de lambdas Java 8.
la source
LevelLogger
), ce qui n'est pas une bonne chose car ce sont généralement des informations très utiles.Cela peut être fait avec une
enum
méthode et une aide:Vous pouvez ajouter d'autres variantes de
log
, par exemple si vous vouliez des équivalents génériques du paramètre 1 ou 2 paramètres de SLF4Jwarn
/error
/ etc. méthodes.la source
Quiconque souhaite une solution entièrement compatible SLF4J à ce problème pourrait vouloir consulter les extensions Lidalia SLF4J - c'est sur Maven Central.
la source
J'ai juste besoin de quelque chose comme ça et j'ai trouvé:
usage:
Logger est passé lors de l'invocation, donc les informations de classe devraient être correctes, et cela fonctionne bien avec l'annotation @ Slf4j lombok.
la source
DEBUG
est manquant comme constante.LogLevel
tant que classe et enlog
tant que méthode, ce qui rend les journaux moins significatifs.Il n'est pas possible de spécifier un niveau de journalisation dans sjf4j
1.x
hors de la boîte. Mais il y a de l'espoir pour slf4j2.0
de résoudre le problème . En 2.0, cela pourrait ressembler à ceci:En attendant, pour slf4j 1.x, vous pouvez utiliser cette solution de contournement:
Copiez cette classe dans votre chemin de classe:
Ensuite, vous pouvez l'utiliser comme ceci:
Cela produira un journal comme celui-ci:
Est-ce que ça vaut le coup?
LogLevel
Le code source comme exemple minimal est hébergé sur GitHub .
la source
LogMethod
interface doit être publique pour qu'elle fonctionne avec des classes en dehors de son package. Autre que cela, cela fonctionne comme prévu. Merci!Il n'est pas possible avec l'API slf4j de modifier dynamiquement le niveau de journalisation, mais vous pouvez configurer la connexion (si vous l'utilisez) par vous-même. Dans ce cas, créez une classe d'usine pour votre enregistreur et implémentez l'enregistreur racine avec la configuration dont vous avez besoin.
Après avoir configuré l'enregistreur racine (une seule fois suffit), vous pouvez déléguer l'obtention d'un nouvel enregistreur en
N'oubliez pas d'utiliser la même chose
loggerContext
.Changer le niveau de journalisation est facile à faire avec l'enregistreur racine fourni par
loggerContext
.la source
Confirmer la réponse Ondrej Skopek
Vous obtiendrez le résultat:
la source
Je viens de rencontrer un besoin similaire. Dans mon cas, slf4j est configuré avec l'adaptateur de journalisation java (le jdk14). À l'aide de l'extrait de code suivant, j'ai réussi à modifier le niveau de débogage au moment de l'exécution:
la source
Sur la base de la réponse de massimo virgilio, j'ai également réussi à le faire avec slf4j-log4j en utilisant l'introspection. HTH.
la source
Voici une solution lambda pas aussi conviviale que celle de @Paul Croarkin dans un sens (le niveau est effectivement passé deux fois). Mais je pense que (a) l'utilisateur devrait passer le Logger; et (b) AFAIU la question initiale ne demandait pas un moyen pratique pour partout dans l'application, seulement une situation avec peu d'utilisations à l'intérieur d'une bibliothèque.
Étant donné que slf4j autorise un Throwable (dont la trace de la pile doit être enregistrée) dans le paramètre varargs , je pense qu'il n'est pas nécessaire de surcharger la
log
méthode d'assistance pour d'autres consommateurs que(String, Object[])
.la source
J'ai pu le faire pour la liaison JDK14 en demandant d'abord l'instance SLF4J Logger, puis en définissant le niveau de la liaison - vous pouvez essayer ceci pour la liaison Log4J.
la source
La méthode que j'utilise consiste à importer les modules ch.qos.logback, puis à transtyper l'instance de slf4j Logger en ch.qos.logback.classic.Logger. Cette instance inclut une méthode setLevel ().
Pour connaître les niveaux de journalisation possibles, vous pouvez exploser la classe ch.qos.logback pour voir toutes les valeurs possibles pour Level :
Les résultats sont les suivants:
la source
en utilisant l'introspection java, vous pouvez le faire, par exemple:
la source
non, il a un certain nombre de méthodes, info (), debug (), warn (), etc. (cela remplace le champ de priorité)
jetez un œil à http://www.slf4j.org/api/org/slf4j/Logger.html pour consulter l'API Logger complète.
la source