The JavaDocs untukjava.util.logging.Level
negara:
Level-level dalam urutan menurun adalah:
SEVERE
(nilai tertinggi)WARNING
INFO
CONFIG
FINE
FINER
FINEST
(nilai terendah)
Sumber
import java.util.logging.*;
class LoggingLevelsBlunder {
public static void main(String[] args) {
Logger logger = Logger.getAnonymousLogger();
logger.setLevel(Level.FINER);
System.out.println("Logging level is: " + logger.getLevel());
for (int ii=0; ii<3; ii++) {
logger.log(Level.FINE, ii + " " + (ii*ii));
logger.log(Level.INFO, ii + " " + (ii*ii));
}
}
}
Keluaran
Logging level is: FINER
Jun 11, 2011 9:39:23 PM LoggingLevelsBlunder main
INFO: 0 0
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 1 1
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 2 4
Press any key to continue . . .
Pernyataan masalah
Contoh saya menyetel Level
ke FINER
, jadi saya mengharapkan untuk melihat 2 pesan untuk setiap loop. Sebaliknya saya melihat satu pesan untuk setiap loop ( Level.FINE
pesan hilang).
Pertanyaan
Apa yang perlu diubah untuk melihat keluaran FINE
(, FINER
atau FINEST
)?
Perbarui (solusi)
Berkat jawaban Vineet Reynolds , versi ini bekerja sesuai ekspektasi saya. Ini menampilkan 3 x INFO
pesan, & 3 x FINE
pesan.
import java.util.logging.*;
class LoggingLevelsBlunder {
public static void main(String[] args) {
Logger logger = Logger.getAnonymousLogger();
// LOG this level to the log
logger.setLevel(Level.FINER);
ConsoleHandler handler = new ConsoleHandler();
// PUBLISH this level
handler.setLevel(Level.FINER);
logger.addHandler(handler);
System.out.println("Logging level is: " + logger.getLevel());
for (int ii=0; ii<3; ii++) {
logger.log(Level.FINE, ii + " " + (ii*ii));
logger.log(Level.INFO, ii + " " + (ii*ii));
}
}
}
java
logging
java.util.logging
Andrew Thompson
sumber
sumber
Jawaban:
Penebang hanya mencatat pesan, yaitu mereka membuat catatan log (atau permintaan logging). Mereka tidak mempublikasikan pesan ke tujuan, yang diurus oleh Penangan. Menyetel level logger, hanya menyebabkannya membuat catatan log yang cocok dengan level itu atau lebih tinggi.
Anda mungkin menggunakan
ConsoleHandler
(saya tidak bisa menyimpulkan di mana output Anda adalah System.err atau file, tetapi saya akan berasumsi bahwa itu adalah yang pertama), yang secara default menerbitkan catatan log dari level tersebutLevel.INFO
. Anda harus mengkonfigurasi penangan ini, untuk menerbitkan catatan log tingkatLevel.FINER
dan lebih tinggi, untuk hasil yang diinginkan.Saya akan merekomendasikan membaca panduan Ikhtisar Logging Java , untuk memahami desain yang mendasarinya. Panduan ini mencakup perbedaan antara konsep Logger dan Handler.
Mengedit level penangan
1. Menggunakan file Konfigurasi
File properti java.util.logging (secara default, ini adalah
logging.properties
file diJRE_HOME/lib
) dapat dimodifikasi untuk mengubah tingkat default ConsoleHandler:2. Membuat penangan saat runtime
Ini tidak disarankan, karena akan mengakibatkan penggantian konfigurasi global. Menggunakan ini di seluruh basis kode Anda akan menghasilkan konfigurasi logger yang mungkin tidak dapat dikelola.
sumber
Handler
.Logger.getGlobal().getParent().getHandlers()[0].setLevel(Level.FINER);
Mengapa
java.util.logging memiliki root logger sebagai default
Level.INFO
, dan ConsoleHandler yang terpasang padanya yang juga default keLevel.INFO
.FINE
lebih rendah dariINFO
, jadi pesan halus tidak ditampilkan secara default.Solusi 1
Buat logger untuk seluruh aplikasi Anda, misalnya dari nama paket atau penggunaan Anda
Logger.getGlobal()
, dan kaitkan ConsoleLogger Anda sendiri ke sana. Kemudian minta logger root untuk diam (untuk menghindari output duplikat dari pesan tingkat yang lebih tinggi), atau minta logger Anda untuk tidak meneruskan log ke root.Solusi 2
Atau, Anda dapat menurunkan bilah logger root.
Anda dapat mengaturnya dengan kode:
Atau dengan file konfigurasi logging, jika Anda menggunakannya :
Dengan menurunkan level global, Anda mungkin mulai melihat pesan dari pustaka inti, seperti dari beberapa komponen Swing atau JavaFX. Dalam hal ini Anda dapat mengatur Filter pada root logger untuk menyaring pesan yang bukan dari program Anda.
sumber
mengapa java logging saya tidak berfungsi
menyediakan file jar yang akan membantu Anda mengetahui mengapa proses masuk Anda tidak berfungsi seperti yang diharapkan. Ini memberi Anda dump lengkap dari logger dan penangan apa yang telah diinstal dan level apa yang ditetapkan dan pada level mana dalam hierarki logging.
sumber
MENGAPA
Seperti yang disebutkan oleh @Sheepy, alasan mengapa ini tidak berfungsi adalah karena
java.util.logging.Logger
memiliki logger root sebagai defaultLevel.INFO
, danConsoleHandler
lampiran ke logger root juga defaultLevel.INFO
. Oleh karena itu, untuk melihat keluaranFINE
(,FINER
atauFINEST
), Anda perlu menyetel nilai default dari logger root danConsoleHandler
keLevel.FINE
sebagai berikut:Masalah Pembaruan Anda (solusi)
Seperti yang disebutkan oleh @mins, Anda akan memiliki pesan yang dicetak dua kali pada konsol untuk
INFO
dan yang lebih tinggi: pertama oleh pencatat anonim, kemudian oleh induknya, pencatat akar yang juga telahConsoleHandler
disetel keINFO
secara default. Untuk menonaktifkan root logger, Anda perlu menambahkan baris kode ini:logger.setUseParentHandlers(false);
Ada cara lain untuk mencegah log diproses oleh pengendali Konsol default dari logger root yang disebutkan oleh @Sheepy, misalnya:
Tetapi
Logger.getLogger("").setLevel( Level.OFF );
tidak akan berfungsi karena hanya memblokir pesan yang diteruskan langsung ke root logger, bukan pesan yang berasal dari logger anak. Untuk mengilustrasikan caraLogger Hierarchy
kerjanya, saya menggambar diagram berikut:public void setLevel(Level newLevel)
setel level log yang menentukan level pesan mana yang akan dicatat oleh logger ini. Level pesan yang lebih rendah dari nilai ini akan dibuang. Nilai level Level.OFF dapat digunakan untuk mematikan logging. Jika level baru adalah null, itu berarti node ini harus mewarisi levelnya dari leluhur terdekatnya dengan nilai level tertentu (bukan null).sumber
Saya menemukan masalah saya yang sebenarnya dan tidak disebutkan dalam jawaban apa pun: beberapa pengujian unit saya menyebabkan kode inisialisasi logging dijalankan beberapa kali dalam rangkaian pengujian yang sama, mengacaukan logging pada pengujian selanjutnya.
sumber
Mencoba varian lain, ini mungkin tepat
sumber
Solusi ini tampak lebih baik bagi saya, berkenaan dengan pemeliharaan dan desain untuk perubahan:
Buat file properti logging, sematkan di folder proyek sumber daya, untuk dimasukkan ke dalam file jar:
Muat file properti dari kode:
sumber