Jak skonfigurować slf4j-simple

166

api 1.7 i slf4j-simple jako implementacja. Po prostu nie mogę znaleźć sposobu skonfigurowania poziomu rejestrowania za pomocą tej kombinacji.

Czy ktoś może pomóc?

Gelin Luo
źródło
Domyślnie jest to INFO do stdout, FWIW: saltnlight5.blogspot.com/2013/08/…
rogerdpack

Odpowiedzi:

218

Dzieje się tak przez właściwość systemu

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

lub simplelogger.propertiesplik w ścieżce klas

zobacz http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html, aby uzyskać szczegółowe informacje

Evgeniy Dorofeev
źródło
dzięki Ustawiłem "org.slf4j.simpleLogger.defaultLogLevel" na "błąd" w System.properties, jednak slf4j nadal rejestruje komunikaty poziomu INFO. Dowolny pomysł? BTW, gdzie powinienem umieścić simplelogger.properties?
Gelin Luo
2
spróbuj org.slf4j.simplelogger.defaultlog zamiast org.slf4j.simpleLogger.defaultLogLevel. Plik musi znajdować się w ścieżce klas, domyślny pakiet
Evgeniy Dorofeev
2
Właściwie to ( defaultLogLevel) działa. Właśnie znalazłem, że modyfikowałem program w złym folderze ;-) I defaultlognie działa. Więc prawdopodobnie chcesz zmienić swoją odpowiedź, chociaż ją zaakceptowałem
Gelin Luo
11
Uwaga: w rzeczywistości obie odpowiedzi są dobre, w zależności od używanej wersji SimpleLogger. Na przykład defaultLogLevel działa w wersji 1.7.5, ale defaultlog działa w wersji 1.6.6. Dowiedziałem się o tym podczas konfigurowania logowania do mojego projektu i napotykając ten post
Ken Shih
112

To jest próbka, simplelogger.propertiesktórą możesz umieścić na ścieżce klas (odkomentuj właściwości, których chcesz użyć):

# 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
źródło
1
@RobertHunt Jak zapisać ten login do pliku?
Devavrata
6
@Devavrata dodaj właściwość org.slf4j.simpleLogger.logFile- docelowy wynik, którym może być ścieżka do pliku lub specjalne wartości „System.out” i „System.err”. Domyślnie jest to „System.err”. Zobacz slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt
Czy można mieć wiele wartości? Jeśli tak, to jak? Tak jak chcę org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd asdad
1
@LOLWTFasdasdasdad Niestety nie, obsługuje tylko pojedyncze cele, System.out, System.err lub ścieżkę do pliku. Został zaprojektowany tak, aby był prosty, powinieneś rozważyć pełną implementację rejestrowania, taką jak Log4J lub Logback, jeśli potrzebujesz bardziej zaawansowanych funkcji.
Robert Hunt
74

Możesz to zmienić programowo, ustawiając właściwość systemową:

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

    }
}

Poziomy dziennika to ERROR> WARN> INFO> DEBUG> TRACE.

Należy pamiętać, że po utworzeniu rejestratora nie można zmienić poziomu dziennika. Jeśli chcesz dynamicznie zmieniać poziom rejestrowania, możesz użyć log4j z SLF4J.

eemelipa
źródło
3
„Należy pamiętać, że po utworzeniu rejestratora nie można zmienić poziomu dziennika”. - Gdzie to jest właściwie określone?
ksl
2
ksl w org.slf4j.impl.SimpleLogger. Po utworzeniu pierwszego programu rejestrującego uruchamiana jest metoda init (), która pobiera domyślny poziom rejestrowania z właściwości systemu. To nie jest odświeżane w żadnym momencie. Ponadto org.slf4j.impl.SimpleLoggerFactory tworzy program rejestrujący dla klasy tylko raz, w związku z czym ten sam program rejestrujący jest zawsze zwracany dla danej klasy (lub nazwy). Możliwe jest jednak posiadanie rejestratorów o różnym poziomie. Zatem możliwe obejście może polegać na przypisaniu tych różnych poziomów rejestrowania do zmiennej „log”, gdy chcesz zmienić poziom rejestrowania. To niezbyt zgrabne rozwiązanie, ale powinno działać.
eemelipa
@Eemuli org.slf4j.impl.SimpleLoggerMasz na myśli rzeczywisty kod źródłowy, a nie dokument?
ksl
Czy prawdą jest również, że tej LOG_FILE_KEYwłaściwości nie można zmienić po utworzeniu programu rejestrującego?
ksl
1
Tak, mam na myśli rzeczywisty kod źródłowy. Nie mam pewności co do LOG_FILE_KEY.
eemelipa
4

Zauważyłem, że Eemuli powiedział, że nie możesz zmienić poziomu dziennika po ich utworzeniu - i chociaż może to być projekt, nie jest to do końca prawda.

Wpadłem w sytuację, w której korzystałem z biblioteki, która logowała się do slf4j - i korzystałem z tej biblioteki podczas pisania wtyczki maven mojo.

Maven używa (zhakowanej) wersji Slf4j SimpleLogger i nie udało mi się uzyskać kodu mojej wtyczki, aby przekierować jego logowanie do czegoś takiego jak log4j, nad którym mogłem kontrolować.

I nie mogę zmienić konfiguracji logowania Mavena.

Tak więc, aby uciszyć niektóre hałaśliwe komunikaty informacyjne, odkryłem, że mogę użyć refleksji w ten sposób, aby futz z SimpleLogger w czasie wykonywania.

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

Oczywiście, zauważ, że nie jest to bardzo stabilne / niezawodne rozwiązanie ... ponieważ zepsuje się następnym razem, gdy ludzie-maven zmienią swój rejestrator.

user2163960
źródło