Slf4j-simple nasıl yapılandırılır


Yanıtlar:


218

Ya sistem özelliği ile

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

veya simplelogger.propertiessınıf yolundaki dosya

bkz http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html detaylar için


teşekkürler "org.slf4j.simpleLogger.defaultLogLevel" ayarını System.properties dosyasında "error" olarak ayarladım, ancak slf4j hala INFO düzey mesajlarını kaydeder. Herhangi bir fikir? BTW, simplelogger.properties'i nereye koymalıyım?
Gelin Luo

2
org.slf4j.simpleLogger.defaultLogLevel yerine org.slf4j.simplelogger.defaultlog dosyasını deneyin. Dosya sınıf yolunda olmalı, varsayılan paket
Evgeniy Dorofeev

2
Aslında bu ( defaultLogLevel) çalışır.Yanlış bir klasörde programı değiştirdiğimi buldum ;-) Ve defaultlogçalışmıyor. Bu yüzden muhtemelen cevabınızı kabul
etsem

11
Sadece bir not: Kullandığınız SimpleLogger sürümüne bağlı olarak aslında her iki cevap da iyidir. Örneğin, defaultLogLevel 1.7.5 için çalışır, ancak defaultlog 1.6.6 için çalışır. Proje günlüğümü yapılandırırken ve bu
gönderiye

112

Bu, simplelogger.propertiessınıfyoluna yerleştirebileceğiniz bir örnektir (kullanmak istediğiniz özellikleri açın):

# 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 Bu günlük nasıl dosyaya kaydedilir?
Devavrata

6
@Devavrata özelliği ekle org.slf4j.simpleLogger.logFile- Bir dosyanın yolu veya "System.out" ve "System.err" özel değerleri olabilecek çıktı hedefi. Varsayılan "System.err" dir. Bkz. Slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt

Birden fazla değere sahip olmak mümkün mü? Evet ise nasıl? İstediğim gibi org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd asdad

1
@LOLWTFasdasdasdad Maalesef, yalnızca System.out, System.err veya bir dosya yolu gibi tek hedefleri desteklemez. Basit olacak şekilde tasarlanmıştır, daha gelişmiş özellikler istiyorsanız Log4J veya Logback gibi tam bir günlük tutma uygulamasını düşünmelisiniz.
Robert Hunt

75

System özelliğini ayarlayarak programlı olarak değiştirebilirsiniz:

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

    }
}

Günlük düzeyleri HATA> WARN> INFO> DEBUG> TRACE şeklindedir.

Kaydedici oluşturulduktan sonra günlük seviyesinin değiştirilemeyeceğini lütfen unutmayın. Dinamik günlük düzeyini değiştirmek gerekirse kullanmak isteyebilirsiniz log4j SLF4J ile.


3
"Kaydedici oluşturulduktan sonra günlük seviyesinin değiştirilemeyeceğini lütfen unutmayın." - Bu gerçekte nerede belirtildi?
ksl

2
ksl, org.slf4j.impl.SimpleLogger içinde. İlk günlükçü oluşturulduğunda, init () yöntemi çalıştırılır ve sistem özelliklerinden varsayılan günlük düzeyini alır. Bu hiçbir noktada yenilenmez. Ayrıca, org.slf4j.impl.SimpleLoggerFactory bir sınıf için yalnızca bir kez bir günlükçü oluşturur, böylece aynı günlükçü her zaman verilen sınıf (veya ad) için döndürülür. Ancak, farklı seviyelerde kaydedicilere sahip olmak mümkündür. Olası geçici çözüm, günlük kaydı düzeyini değiştirmek istediğinizde bu farklı düzey günlükçülerini "günlük" değişkeninize atamanız olabilir. Çok düzgün bir çözüm değil ama işe yaramalı.
eemelipa

@Eemuli Şunu org.slf4j.impl.SimpleLoggermu demek istediniz: doc yerine asıl kaynak kodu?
KSL

Ayrıca LOG_FILE_KEY, günlükçü oluşturulduktan sonra özelliğin değiştirilemeyeceği de doğru mu?
ksl

1
Evet, gerçek kaynak kodunu kastediyorum. LOG_FILE_KEY hakkında emin değilim.
eemelipa

4

Eemuli'nin oluşturulduktan sonra günlük düzeyini değiştiremeyeceğinizi söylediğini fark ettim - ve bu tasarım olsa da, tamamen doğru değil.

Slf4j'ye giriş yapan bir kütüphane kullandığım bir durumla karşılaştım ve bir maven mojo eklentisi yazarken kütüphaneyi kullanıyordum.

Maven slf4j SimpleLogger'ın (saldırıya uğramış) bir sürümünü kullanıyor ve günlük kaydını kontrol edebileceğim log4j gibi bir şeye yeniden yönlendirmek için eklenti kodumu alamadım.

Ve maven günlük yapılandırmasını değiştiremiyorum.

Bu nedenle, bazı gürültülü bilgi mesajlarını susturmak için, çalışma zamanında SimpleLogger ile futz yapmak için böyle bir yansımayı kullanabileceğimi buldum.

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

Tabii ki, bunun çok istikrarlı / güvenilir bir çözüm olmadığını unutmayın ... çünkü maven millet kaydedicilerini bir sonraki değiştirişinde kırılacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.