it-swarm.com.de

So konfigurieren Sie slf4j-simple

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

Kann mir jemand helfen?

143
Gelin Luo

Entweder durch Systemeigenschaft

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

oder simplelogger.properties Datei im Klassenpfad

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

193

Dies ist ein Beispiel simplelogger.properties, das 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
91
Robert Hunt

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 lauten ERROR> WARN> INFO> DEBUG> TRACE.

Bitte beachten Sie, dass der Protokolliergrad nach dem Erstellen des Protokollierers nicht mehr geändert werden kann. Wenn Sie die Protokollierungsstufe dynamisch ändern müssen, können Sie log4j mit SLF4J verwenden.

68
Eemuli

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

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, als 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 Konfiguration der Maven-Protokollierung nicht ändern.

Um einige laute Infomeldungen zu beruhigen, konnte ich diese Überlegung verwenden, 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, dass dies keine sehr stabile/zuverlässige Lösung ist, da sie beim nächsten Wechsel des Loggers durch die Maven-Leute zum Erliegen kommt.

1
user2163960