So konfigurieren Sie slf4j-simple

166

api 1.7 und slf4j-simple als implementierung. Ich kann einfach nicht herausfinden, wie die Protokollierungsstufe mit dieser Kombination konfiguriert werden kann.

Kann mir jemand helfen?

Gelin Luo
quelle
Die Standardeinstellung ist INFO zu stdout, FWIW: saltnlight5.blogspot.com/2013/08/…
rogerdpack

Antworten:

218

Es ist entweder durch Systemeigenschaft

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

oder simplelogger.propertiesDatei auf dem Klassenpfad

Weitere Informationen finden Sie unter http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html

Evgeniy Dorofeev
quelle
danke Ich habe "org.slf4j.simpleLogger.defaultLogLevel" in System.properties auf "error" gesetzt, aber slf4j protokolliert immer noch Nachrichten auf INFO-Ebene. Irgendeine Idee? Übrigens, wo soll ich simplelogger.properties ablegen?
Gelin Luo
2
Versuchen Sie org.slf4j.simplelogger.defaultlog anstelle von org.slf4j.simpleLogger.defaultLogLevel. Datei muss auf dem Klassenpfad sein, Standardpaket
Evgeniy Dorofeev
2
Eigentlich defaultLogLevelfunktioniert es ( ). Ich habe gerade festgestellt, dass ich das Programm in einem falschen Ordner geändert habe ;-) Und es defaultlogfunktioniert nicht. Also möchten Sie wahrscheinlich Ihre Antwort bearbeiten, obwohl ich sie akzeptiert habe
Gelin Luo
11
Nur eine Anmerkung: Tatsächlich sind beide Antworten gut, abhängig von der Version von SimpleLogger, die Sie verwenden. Beispielsweise funktioniert defaultLogLevel für 1.7.5, defaultlog jedoch für 1.6.6. Ich fand dies heraus, als ich meine Projektprotokollierung konfigurierte und auf diesen Beitrag stieß
Ken Shih
112

Dies ist ein Beispiel, simplelogger.propertiesdas Sie in den Klassenpfad einfügen können (kommentieren Sie die Eigenschaften aus, die Sie verwenden möchten):

# 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
quelle
1
@RobertHunt Wie speichere ich dieses Log in einer Datei?
Devavrata
6
@ Devavrata add the property org.slf4j.simpleLogger.logFile- Das Ausgabeziel, das der Pfad zu einer Datei sein kann, oder die speziellen Werte "System.out" und "System.err". Standard ist "System.err". Siehe slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt
Ist es möglich, mehrere Werte zu haben? Wenn ja wie? Wie möchte ich org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd asdad
1
@LOLWTFasdasdasdad Leider nicht, es werden nur einzelne Ziele unterstützt, entweder System.out, System.err oder ein Pfad zu einer Datei. Es ist so konzipiert, dass es einfach ist. Sie sollten eine vollständige Protokollierungsimplementierung wie Log4J oder Logback in Betracht ziehen, wenn Sie erweiterte Funktionen wünschen.
Robert Hunt
74

Sie können es programmgesteuert ändern, indem Sie die Systemeigenschaft festlegen:

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

    }
}

Die Protokollebenen sind ERROR> WARN> INFO> DEBUG> TRACE.

Bitte beachten Sie, dass nach dem Erstellen des Loggers die Log-Ebene nicht mehr geändert werden kann. Wenn Sie die Protokollierungsstufe dynamisch ändern müssen, möchten Sie möglicherweise log4j mit SLF4J verwenden.

Eemelipa
quelle
3
"Bitte beachten Sie, dass nach dem Erstellen des Loggers die Log-Ebene nicht mehr geändert werden kann." - Wo ist das eigentlich angegeben?
ksl
2
ksl, in org.slf4j.impl.SimpleLogger. Wenn der erste Protokollierer erstellt wird, wird die Methode init () ausgeführt und die Standardprotokollierungsstufe wird aus den Systemeigenschaften abgerufen. Dies wird zu keinem Zeitpunkt aktualisiert. Außerdem erstellt org.slf4j.impl.SimpleLoggerFactory nur einmal einen Logger für eine Klasse, sodass für dieselbe Klasse (oder jeden Namen) immer derselbe Logger zurückgegeben wird. Es ist jedoch möglich, Logger mit unterschiedlichen Ebenen zu haben. Eine mögliche Problemumgehung könnte darin bestehen, dass Sie diese "Ebene" -Logger Ihrer "Protokoll" -Variablen zuweisen, wenn Sie die Protokollierungsstufe ändern möchten. Es ist keine sehr saubere Lösung, sollte aber funktionieren.
Eemelipa
@Eemuli Mit org.slf4j.impl.SimpleLoggermeinen Sie den tatsächlichen Quellcode und nicht das Dokument?
ksl
Stimmt es auch, dass die LOG_FILE_KEYEigenschaft auch nach dem Erstellen des Loggers nicht mehr geändert werden kann?
ksl
1
Ja, ich meine den eigentlichen Quellcode. Ich bin mir bei LOG_FILE_KEY nicht sicher.
Eemelipa
4

Mir ist aufgefallen, dass Eemuli gesagt hat, dass Sie die Protokollebene nach ihrer Erstellung nicht mehr ändern können - und obwohl dies das Design sein könnte, ist es nicht ganz richtig.

Ich bin auf eine Situation gestoßen, in der ich eine Bibliothek verwendet habe, die sich bei slf4j angemeldet hat - und ich habe die Bibliothek verwendet, während ich ein Maven-Mojo-Plugin geschrieben habe.

Maven verwendet eine (gehackte) Version des slf4j SimpleLogger, und ich konnte meinen Plugin-Code nicht dazu bringen, seine Protokollierung auf etwas wie log4j umzuleiten, das ich steuern konnte.

Und ich kann die Maven-Protokollierungskonfiguration nicht ändern.

Um einige verrauschte Info-Nachrichten zu beruhigen, stellte ich fest, dass ich eine solche Reflexion verwenden könnte, um zur Laufzeit mit dem SimpleLogger zu fummeln.

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

Beachten Sie natürlich, dass dies keine sehr stabile / zuverlässige Lösung ist ... da sie beim nächsten Wechsel der Maven-Leute ihren Logger kaputt macht.

user2163960
quelle