Comment configurer slf4j-simple

166

api 1.7 et slf4j-simple comme implémentation. Je ne trouve tout simplement pas comment configurer le niveau de journalisation avec cette combinaison.

Quelqu'un peut-il aider?

Gelin Luo
la source
La valeur par défaut est INFO sur stdout, FWIW: saltnlight5.blogspot.com/2013/08/…
rogerdpack

Réponses:

218

C'est soit via la propriété système

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

ou simplelogger.properties fichier sur le chemin de classe

voir http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html pour plus de détails

Evgeniy Dorofeev
la source
merci j'ai mis "org.slf4j.simpleLogger.defaultLogLevel" à "erreur" dans System.properties, cependant slf4j enregistre toujours les messages de niveau INFO. Une idée? BTW, où dois-je mettre simplelogger.properties?
Gelin Luo
2
essayez org.slf4j.simplelogger.defaultlog au lieu de org.slf4j.simpleLogger.defaultLogLevel. Le fichier doit être sur le chemin de classe, package par défaut
Evgeniy Dorofeev
2
En fait ça ( defaultLogLevel) marche. Je viens de trouver que je modifiais le programme dans un mauvais dossier ;-) Et defaultlogça ne marche pas. Donc, vous voudrez probablement modifier votre réponse même si je l'ai acceptée
Gelin Luo
11
Juste une note: en fait, les deux réponses sont bonnes, selon la version de SimpleLogger que vous utilisez. Par exemple, defaultLogLevel fonctionne pour la version 1.7.5, mais defaultlog fonctionne pour la version 1.6.6. J'ai découvert cela lors de la configuration de la journalisation de mon projet et de la publication de ce message
Ken Shih
112

Voici un exemple simplelogger.propertiesque vous pouvez placer sur le classpath (décommentez les propriétés que vous souhaitez utiliser):

# SLF4J's SimpleLogger configuration file
# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.

# Default logging detail level for all instances of SimpleLogger.
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, defaults to "info".
#org.slf4j.simpleLogger.defaultLogLevel=info

# Logging detail level for a SimpleLogger instance named "xxxxx".
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, the default logging detail level is used.
#org.slf4j.simpleLogger.log.xxxxx=

# Set to true if you want the current date and time to be included in output messages.
# Default is false, and will output the number of milliseconds elapsed since startup.
#org.slf4j.simpleLogger.showDateTime=false

# The date and time format to be used in the output messages.
# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
# If the format is not specified or is invalid, the default format is used.
# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z

# Set to true if you want to output the current thread name.
# Defaults to true.
#org.slf4j.simpleLogger.showThreadName=true

# Set to true if you want the Logger instance name to be included in output messages.
# Defaults to true.
#org.slf4j.simpleLogger.showLogName=true

# Set to true if you want the last component of the name to be included in output messages.
# Defaults to false.
#org.slf4j.simpleLogger.showShortLogName=false
Robert Hunt
la source
1
@RobertHunt Comment enregistrer ce journal dans un fichier?
Devavrata
6
@Devavrata ajouter la propriété org.slf4j.simpleLogger.logFile- La cible de sortie qui peut être le chemin vers un fichier, ou les valeurs spéciales "System.out" et "System.err". La valeur par défaut est "System.err". Voir slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt
Est-il possible d'avoir plusieurs valeurs? Si oui comment? Comme je veux org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd asdad
1
@LOLWTFasdasdasdad Malheureusement non, il ne prend en charge que des cibles uniques, soit System.out, System.err ou un chemin vers un fichier. Il est conçu pour être simple, vous devriez envisager une implémentation de journalisation complète comme Log4J ou Logback si vous souhaitez des fonctionnalités plus avancées.
Robert Hunt
75

Vous pouvez le modifier par programme en définissant la propriété système:

public class App {

    public static void main(String[] args) {

        System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE");

        final org.slf4j.Logger log = LoggerFactory.getLogger(App.class);

        log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warning");
        log.error("error");

    }
}

Les niveaux de journalisation sont ERROR> WARN> INFO> DEBUG> TRACE.

Veuillez noter qu'une fois l'enregistreur créé, le niveau de journalisation ne peut pas être modifié. Si vous avez besoin de modifier dynamiquement le niveau de journalisation, vous pouvez utiliser log4j avec SLF4J.

eemelipa
la source
3
"Veuillez noter qu'une fois l'enregistreur créé, le niveau de journalisation ne peut plus être modifié." - Où est-ce réellement spécifié?
ksl
2
ksl, dans org.slf4j.impl.SimpleLogger. Lorsque le premier enregistreur est créé, la méthode init () est exécutée et elle récupère le niveau de journalisation par défaut à partir des propriétés système. Ce n'est actualisé à aucun moment. De plus, org.slf4j.impl.SimpleLoggerFactory crée un enregistreur pour une classe une seule fois, ainsi, le même enregistreur est toujours retourné pour une classe (ou un nom) donné. Cependant, il est possible d'avoir des enregistreurs de niveau différent. Donc, la solution de contournement possible pourrait être que vous affectez ces différents niveaux de journalisation à votre variable «journal» lorsque vous souhaitez modifier le niveau de journalisation. Ce n'est pas une solution très soignée mais devrait fonctionner.
eemelipa
@Eemuli Par org.slf4j.impl.SimpleLoggervous voulez dire le code source réel plutôt que doc?
ksl
Est-il également vrai que la LOG_FILE_KEYpropriété ne peut pas non plus être modifiée une fois l'enregistreur créé?
ksl
1
Oui, je veux dire le code source réel. Je ne suis pas sûr de LOG_FILE_KEY.
eemelipa
4

J'ai remarqué qu'Eemuli a dit que vous ne pouvez pas changer le niveau de journal après leur création - et bien que cela puisse être la conception, ce n'est pas tout à fait vrai.

Je suis tombé sur une situation où j'utilisais une bibliothèque qui se connectait à slf4j - et j'utilisais la bibliothèque tout en écrivant un plugin maven mojo.

Maven utilise une version (piratée) du slf4j SimpleLogger, et je n'ai pas pu obtenir le code de mon plugin pour rediriger sa journalisation vers quelque chose comme log4j, que je pouvais contrôler.

Et je ne peux pas changer la configuration de journalisation maven.

Donc, pour calmer certains messages d'information bruyants, j'ai trouvé que je pouvais utiliser une réflexion comme celle-ci, pour utiliser le SimpleLogger au moment de l'exécution.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
    try
    {
        Logger l = LoggerFactory.getLogger("full.classname.of.noisy.logger");  //This is actually a MavenSimpleLogger, but due to various classloader issues, can't work with the directly.
        Field f = l.getClass().getSuperclass().getDeclaredField("currentLogLevel");
        f.setAccessible(true);
        f.set(l, LocationAwareLogger.WARN_INT);
    }
    catch (Exception e)
    {
        getLog().warn("Failed to reset the log level of " + loggerName + ", it will continue being noisy.", e);
    }

Bien sûr, notez que ce n'est pas une solution très stable / fiable ... car elle se cassera la prochaine fois que les maven changeront leur enregistreur.

user2163960
la source