Come configurare slf4j-simple


Risposte:


218

È tramite la proprietà di sistema

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

o simplelogger.propertiesfile sul percorso di classe

vedi http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html per i dettagli


grazie ho impostato "org.slf4j.simpleLogger.defaultLogLevel" su "errore" in System.properties, tuttavia slf4j registra comunque i messaggi di livello INFO. Qualche idea? A proposito, dove dovrei mettere simplelogger.properties?
Gelin Luo,

2
prova org.slf4j.simplelogger.defaultlog invece di org.slf4j.simpleLogger.defaultLogLevel. Il file deve trovarsi sul percorso di classe, pacchetto predefinito
Evgeniy Dorofeev il

2
In realtà funziona ( defaultLogLevel). Ho appena scoperto che stavo modificando il programma in una cartella sbagliata ;-) E defaultlognon funziona. Quindi probabilmente vuoi modificare la tua risposta anche se l'ho accettata
Gelin Luo,

11
Solo una nota: in realtà entrambe le risposte sono buone, a seconda della versione di SimpleLogger che stai utilizzando. Ad esempio, defaultLogLevel funziona per 1.7.5, ma defaultlog funziona per 1.6.6. L'ho scoperto quando ho configurato la registrazione del mio progetto e mi sono imbattuto in questo post
Ken Shih,

112

Questo è un esempio simplelogger.propertiesche puoi posizionare sul classpath (decommenta le proprietà che desideri utilizzare):

# 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

1
@RobertHunt Come salvare questo registro in un file?
Devavrata,

6
@Devavrata aggiunge la proprietà org.slf4j.simpleLogger.logFile- La destinazione di output che può essere il percorso di un file o i valori speciali "System.out" e "System.err". L'impostazione predefinita è "System.err". Vedi slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt,

È possibile avere più valori? Se si come? Come se volessi org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd asdad

1
@LOLWTFasdasdasdad Sfortunatamente no, supporta solo destinazioni singole, System.out, System.err o un percorso di un file. È progettato per essere semplice, è necessario prendere in considerazione un'implementazione di registrazione completa come Log4J o Logback se si desidera funzionalità più avanzate.
Robert Hunt,

75

È possibile modificarlo programmaticamente impostando la proprietà di sistema:

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");

    }
}

I livelli di registro sono ERRORE> AVVISO> INFO> DEBUG> TRACE.

Si noti che una volta creato il logger non è possibile modificare il livello di registro. Se è necessario modificare dinamicamente il livello di registrazione, è possibile utilizzare log4j con SLF4J.


3
"Si noti che una volta creato il logger non è possibile modificare il livello di registro." - Dove viene effettivamente specificato?
ksl

2
ksl, in org.slf4j.impl.SimpleLogger. Quando viene creato il primo logger, viene eseguito il metodo init () che recupera il livello di registrazione predefinito dalle proprietà di sistema. Questo non viene aggiornato in nessun momento. Inoltre, org.slf4j.impl.SimpleLoggerFactory crea un logger per una classe solo una volta, quindi lo stesso logger viene sempre restituito per una data classe (o nome). Tuttavia, è possibile avere logger con livello diverso. Una possibile soluzione alternativa potrebbe essere quella di assegnare questi logger di livello diverso alla variabile "log" quando si desidera modificare il livello di registrazione. Non è una soluzione molto accurata ma dovrebbe funzionare.
eemelipa,

@Eemuli org.slf4j.impl.SimpleLoggerIntendi il vero codice sorgente piuttosto che doc?
ksl,

È anche vero che la LOG_FILE_KEYproprietà non può essere modificata neanche una volta creato il logger?
ksl,

1
Sì, intendo l'attuale codice sorgente. Non sono sicuro di LOG_FILE_KEY.
eemelipa,

4

Ho notato che Eemuli ha detto che non è possibile modificare il livello del registro dopo che sono stati creati - e mentre quello potrebbe essere il design, non è del tutto vero.

Mi sono imbattuto in una situazione in cui stavo usando una libreria che si registrava su slf4j - e stavo usando la libreria mentre scrivevo un plugin maven mojo.

Maven utilizza una versione (compromessa) di SimpleLogger slf4j e non sono riuscito a ottenere il mio codice plugin per reindirizzare la sua registrazione su qualcosa come log4j, che potevo controllare.

E non posso cambiare la configurazione di registrazione di Maven.

Quindi, per calmare alcuni messaggi informativi rumorosi, ho scoperto che avrei potuto usare la riflessione in questo modo, per andare a vuoto con il SimpleLogger in fase di esecuzione.

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);
    }

Naturalmente, nota, questa non è una soluzione molto stabile / affidabile ... in quanto si romperà la prossima volta che i malvagi cambieranno il loro logger.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.