Apa pendekatan yang benar untuk mencatat pesan terpopulasi dan jejak stack pengecualian?
logger.error(
"\ncontext info one two three: {} {} {}\n",
new Object[] {"1", "2", "3"},
new Exception("something went wrong"));
Saya ingin menghasilkan keluaran yang mirip dengan ini:
context info one two three: 1 2 3
java.lang.Exception: something went wrong
stacktrace 0
stacktrace 1
stacktrace ...
slf4j versi 1.6.1
{}
lebih banyak, soal selera ...toString()
Metode argumen mungkin mahal. Dengan sintaks ini, hanya referensi ke setiap objek yang diteruskan dantoString()
metode ini hanya dipanggil jika pesan tertentu benar-benar dicatat. Objek yang direferensikan dalaminfo()
panggilan log tidak akan memanggiltoString()
metode mereka jika tingkat logWARN
lebih tinggi. The{}
sintaks adalah pengingat kepada pengguna bahwa ini bukanString.format()
operasi -seperti, yaitu mereka harus lulus objek daripada representasi string yang daripadanya.Jawaban:
Pada SLF4J 1.6.0, di hadapan beberapa parameter dan jika argumen terakhir dalam pernyataan logging adalah pengecualian, maka SLF4J akan menganggap bahwa pengguna ingin argumen terakhir diperlakukan sebagai pengecualian dan bukan parameter sederhana. Lihat juga entri FAQ yang relevan .
Jadi, menulis (dalam SLF4J versi 1.7.x dan yang lebih baru)
atau tulisan (dalam SLF4J versi 1.6.x)
akan menghasilkan
Output yang tepat akan tergantung pada kerangka kerja yang mendasarinya (misalnya logback, log4j, dll) juga pada bagaimana kerangka kerja yang mendasarinya dikonfigurasi. Namun, jika parameter terakhir adalah pengecualian maka akan diinterpretasikan seperti itu terlepas dari kerangka kerja yang mendasarinya.
sumber
Logger
kelas javadoc: slf4j.org/apidocs/org/slf4j/Logger.htmlSelain jawaban @Ceki, Jika Anda menggunakan logback dan menyiapkan file konfigurasi di proyek Anda (biasanya logback.xml), Anda dapat menentukan log untuk memplot jejak stack juga menggunakan
% ex dalam pola adalah apa yang membuat perbedaan
sumber