Cara mengkonfigurasi slf4j-simple

166

api 1.7 dan slf4j-sesederhana implementasi. Saya tidak bisa menemukan cara mengkonfigurasi level logging dengan kombinasi ini.

Adakah yang bisa membantu?

Gelin Luo
sumber
Standarnya adalah INFO ke stdout, FWIW: saltnlight5.blogspot.com/2013/08/…
rogerdpack

Jawaban:

218

Baik melalui properti sistem

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

atau simplelogger.propertiesfile di classpath

lihat http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html untuk detailnya

Evgeniy Dorofeev
sumber
terima kasih saya mengatur "org.slf4j.simpleLogger.defaultLogLevel" menjadi "error" di System.properties, namun slf4j masih mencatat pesan tingkat INFO. Ada ide? BTW, di mana saya harus meletakkan simplelogger.properties?
Gelin Luo
2
coba org.slf4j.simplelogger.defaultlog alih-alih org.slf4j.simpleLogger.defaultLogLevel. File harus ada di classpath, paket default
Evgeniy Dorofeev
2
Sebenarnya itu ( defaultLogLevel) berfungsi. Hanya menemukan saya memodifikasi program di folder yang salah ;-) Dan defaultlogtidak berhasil. Jadi, Anda mungkin ingin mengedit jawaban Anda meskipun saya telah menerimanya
Gelin Luo
11
Hanya sebuah catatan: sebenarnya kedua jawaban itu baik, tergantung pada versi SimpleLogger yang Anda gunakan. Misalnya, defaultLogLevel berfungsi untuk 1.7.5, tetapi defaultlog berfungsi untuk 1.6.6. Saya menemukan ini ketika mengkonfigurasi proyek saya logging dan datang pada posting ini
Ken Shih
112

Ini adalah contoh simplelogger.propertiesyang dapat Anda tempatkan di classpath (batalkan komentar pada properti yang ingin Anda gunakan):

# 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
sumber
1
@RobertHunt Bagaimana cara menyimpan file log ini?
Devavrata
6
@Devavrata menambahkan properti org.slf4j.simpleLogger.logFile- Target keluaran yang dapat menjadi path ke file, atau nilai-nilai khusus "System.out" dan "System.err". Standarnya adalah "System.err". Lihat slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt
Apakah mungkin memiliki beberapa nilai? Jika ya, bagaimana? Seperti yang saya inginkan org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd asdad
1
@ LOLWTFasdasdasdad Sayangnya tidak, itu hanya mendukung target tunggal, baik System.out, System.err atau path ke file. Ini dirancang agar sederhana, Anda harus mempertimbangkan implementasi logging penuh seperti Log4J atau Logback jika Anda menginginkan fitur yang lebih canggih.
Robert Hunt
74

Anda dapat mengubahnya secara terprogram dengan mengatur properti sistem:

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

    }
}

Level lognya adalah ERROR> WARN> INFO> DEBUG> TRACE.

Harap dicatat bahwa setelah logger dibuat, level log tidak dapat diubah. Jika Anda perlu mengubah level logging secara dinamis, Anda mungkin ingin menggunakan log4j dengan SLF4J.

eemelipa
sumber
3
"Harap dicatat bahwa setelah logger dibuat, level log tidak dapat diubah." - Di mana ini sebenarnya ditentukan?
ksl
2
ksl, di org.slf4j.impl.SimpleLogger. Ketika logger pertama dibuat, metode init () dijalankan dan mengambil tingkat logging standar dari properti sistem. Ini tidak disegarkan kapan pun. Juga, org.slf4j.impl.SimpleLoggerFactory membuat logger untuk kelas hanya sekali, dengan demikian, logger yang sama selalu dikembalikan untuk kelas (atau nama) yang diberikan. Namun, ada kemungkinan untuk memiliki penebang dengan tingkat yang berbeda. Jadi solusinya mungkin adalah Anda menetapkan logger level yang berbeda ini ke variabel "log" Anda saat Anda ingin mengubah level logging. Ini bukan solusi yang sangat rapi tetapi harus berhasil.
eemelipa
@Eemuli org.slf4j.impl.SimpleLoggerMaksud Anda kode sumber yang sebenarnya daripada doc?
ksl
Apakah benar juga bahwa LOG_FILE_KEYproperti tidak dapat diubah setelah pencatat dibuat?
ksl
1
Ya, maksud saya kode sumber yang sebenarnya. Saya tidak yakin tentang LOG_FILE_KEY.
eemelipa
4

Saya perhatikan bahwa Eemuli mengatakan bahwa Anda tidak dapat mengubah level log setelah dibuat - dan walaupun itu mungkin desainnya, itu tidak sepenuhnya benar.

Saya mengalami situasi di mana saya menggunakan perpustakaan yang masuk ke slf4j - dan saya menggunakan perpustakaan sambil menulis plugin maven mojo.

Maven menggunakan versi (diretas) dari slf4j SimpleLogger, dan saya tidak bisa mendapatkan kode plugin saya untuk mengubah rute logging ke sesuatu seperti log4j, yang bisa saya kendalikan.

Dan saya tidak bisa mengubah konfigurasi logging pakar.

Jadi, untuk menenangkan beberapa pesan info berisik, saya menemukan saya bisa menggunakan refleksi seperti ini, untuk menggunakan SimpleLogger saat runtime.

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

Tentu saja, perhatikan, ini bukan solusi yang sangat stabil / dapat diandalkan ... karena akan pecah saat berikutnya para pakar mengubah logger mereka.

pengguna2163960
sumber