Saat menggunakan log4j, Logger.log(Priority p, Object message)
metode ini tersedia dan dapat digunakan untuk mencatat pesan pada tingkat log yang ditentukan saat runtime. Kami menggunakan fakta ini dan tip ini untuk mengarahkan stderr ke logger pada tingkat log tertentu.
slf4j tidak memiliki log()
metode umum yang dapat saya temukan. Apakah itu berarti tidak ada cara untuk menerapkan hal di atas?
slf4j 2.0
. jira.qos.ch/browse/SLF4J-124 Lihat jawaban saya untuk detailnya dan untuk kemungkinanslf4j 1.x
solusi.Jawaban:
Tidak ada cara untuk melakukan ini dengan
slf4j
.Saya membayangkan bahwa alasan mengapa fungsi ini hilang adalah karena hampir tidak mungkin untuk membangun
Level
tipeslf4j
yang dapat secara efisien dipetakan ke tipeLevel
(atau setara) yang digunakan di semua kemungkinan implementasi logging di belakang fasad. Alternatifnya, perancang memutuskan bahwa kasus penggunaan Anda terlalu tidak biasa untuk membenarkan biaya tambahan untuk mendukungnya.Mengenai @ ripper234 's penggunaan-kasus (unit testing), saya pikir solusi pragmatis adalah memodifikasi tes unit (s) ke hard-kawat pengetahuan tentang apa sistem logging yang ada di balik fasad slf4j ... ketika menjalankan unit test.
sumber
org.slf4j.Logger
: debug, error, info, trace, warn.Richard Fearn memiliki ide yang tepat, jadi saya menulis kelas lengkapnya berdasarkan kode kerangkanya. Semoga cukup singkat untuk memposting di sini. Salin & tempel untuk kesenangan. Saya mungkin harus menambahkan beberapa mantra ajaib juga: "Kode ini dilepaskan ke domain publik"
sumber
Coba beralih ke Logback dan gunakan
Saya yakin ini akan menjadi satu-satunya panggilan ke Logback dan kode Anda lainnya tidak akan berubah. Logback menggunakan SLF4J dan migrasi tidak akan menimbulkan rasa sakit, hanya file konfigurasi xml yang harus diubah.
Ingatlah untuk menyetel kembali level log setelah Anda selesai.
sumber
Anda bisa mengimplementasikan ini menggunakan Java 8 lambda.
sumber
LevelLogger
), yang bukan merupakan hal yang baik karena umumnya informasi sangat berguna.Ini bisa dilakukan dengan metode an
enum
and helper:Anda dapat menambahkan varian lain dari
log
, katakanlah jika Anda menginginkan persamaan generik dari 1-parameter SLF4J atau 2-parameterwarn
/error
/ etc. metode.sumber
Siapa pun yang menginginkan solusi drop-in yang sepenuhnya kompatibel dengan SLF4J untuk masalah ini mungkin ingin melihat Ekstensi Lidalia SLF4J - ada di Maven Central.
sumber
Saya baru saja membutuhkan sesuatu seperti itu dan muncul dengan:
pemakaian:
Pencatat diteruskan selama pemanggilan, jadi info kelas akan baik-baik saja, dan bekerja dengan baik dengan anotasi @ Slf4j lombok.
sumber
DEBUG
hilang sebagai konstanta.LogLevel
kelas danlog
sebagai, yang membuat log kurang bermakna.Hal ini tidak mungkin untuk menentukan tingkat log di sjf4j
1.x
keluar dari kotak. Tetapi ada harapan bagi slf4j2.0
untuk memperbaiki masalah tersebut . Dalam 2.0 mungkin terlihat seperti ini:Sementara itu, untuk slf4j 1.x, Anda dapat menggunakan solusi ini:
Salin kelas ini ke classpath Anda:
Kemudian Anda bisa menggunakannya seperti ini:
Ini akan mengeluarkan log seperti ini:
Apakah itu layak?
LogLevel
Kode sumber sebagai contoh minimal dihosting di GitHub .
sumber
LogMethod
antarmuka harus bersifat publik agar dapat bekerja dengan kelas di luar paketnya. Selain itu, ini berfungsi sebagaimana mestinya. Terima kasih!Slf4j API tidak mungkin mengubah level log secara dinamis, tetapi Anda dapat mengonfigurasi logback (jika Anda menggunakannya) sendiri. Dalam hal ini, buat kelas pabrik untuk logger Anda dan implementasikan root logger dengan konfigurasi yang Anda perlukan.
Setelah Anda mengkonfigurasi root logger (hanya sekali saja sudah cukup), Anda dapat mendelegasikan mendapatkan logger baru dengan
Ingatlah untuk menggunakan yang sama
loggerContext
.Mengubah level log mudah dilakukan dengan root logger yang diberikan dari
loggerContext
.sumber
Konfirmasikan jawaban Ondrej Skopek
Anda akan mendapatkan hasil:
sumber
Saya baru saja menemukan kebutuhan yang serupa. Dalam kasus saya, slf4j dikonfigurasi dengan adaptor pencatatan java (yang jdk14). Dengan menggunakan cuplikan kode berikut, saya berhasil mengubah level debug saat runtime:
sumber
Berdasarkan jawaban massimo virgilio, saya juga berhasil melakukannya dengan slf4j-log4j menggunakan introspeksi. HTH.
sumber
Berikut adalah solusi lambda yang tidak semudah @Paul Croarkin dalam satu hal (levelnya dilewati secara efektif dua kali). Tapi saya pikir (a) pengguna harus melewati Logger; dan (b) AFAIU pertanyaan awal tidak menanyakan cara yang nyaman untuk semua tempat dalam aplikasi, hanya situasi dengan sedikit penggunaan di dalam perpustakaan.
Karena slf4j memungkinkan Throwable (yang jejak tumpukannya harus dicatat) di dalam parameter varargs , menurut saya tidak perlu membebani
log
metode pembantu untuk konsumen lain selain(String, Object[])
.sumber
Saya dapat melakukan ini untuk pengikatan JDK14 dengan terlebih dahulu meminta instans SLF4J Logger dan kemudian menyetel level pada pengikatan - Anda dapat mencoba ini untuk pengikatan Log4J.
sumber
Metode yang saya gunakan adalah mengimpor modul ch.qos.logback dan kemudian mengetikkan instance Logger slf4j ke ch.qos.logback.classic.Logger. Instance ini menyertakan metode setLevel ().
Untuk mengetahui kemungkinan level Logging, Anda dapat meledakkan kelas ch.qos.logback untuk melihat semua kemungkinan nilai untuk Level :
Hasilnya adalah sebagai berikut:
sumber
menggunakan introspeksi java Anda dapat melakukannya, misalnya:
sumber
tidak, ini memiliki sejumlah metode, info (), debug (), warn (), dll (ini menggantikan bidang prioritas)
lihat di http://www.slf4j.org/api/org/slf4j/Logger.html untuk logger api lengkap.
sumber