Contoh bagus menggunakan java.util.logging [ditutup]

273

Saya ingin menggunakan log di program saya. Saya mendengar tentang java.util.logging , tetapi saya tidak tahu bagaimana memulainya.

Apakah ada contoh apa yang bisa saya lakukan dengan logging? Bagaimana saya menggunakan logging di program saya sendiri?

Renato Dinhani
sumber
7
Anda dapat mulai di sini: slf4j.org/manual.html
Jeremy
1
Saya setuju dengan Steven Vascellaro. Saya lelah melihat barang-barang yang berguna dihancurkan karena kebijakan topik tidak ada habisnya. Selain itu, dengan hormat tidak setuju dengan Jeremy, karena OP bertanya tentang java.util.logging. Saya juga tertarik pada logging asli (terima kasih atas jawabannya, grwww!)
NOP
Untuk mencatat data dalam satu baris: log.log (Level.INFO, "Pesan saya {0}", Obyek baru [] {myDataId});
Mitja Gustin

Jawaban:

335

java.util.logging membuat Anda tidak perlu membawa satu file jar lagi dengan aplikasi Anda, dan itu berfungsi dengan baik dengan Formatter yang baik.

Secara umum, di bagian atas setiap kelas , Anda harus memiliki:

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

Kemudian, Anda bisa menggunakan berbagai fasilitas dari kelas Logger .


Gunakan Level.FINEuntuk apa pun yang sedang debugging di tingkat atas dari aliran eksekusi:

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

Gunakan Level.FINER/ Level.FINESTdi dalam loop dan di tempat-tempat di mana Anda mungkin tidak selalu perlu melihat banyak detail ketika men-debug masalah aliran dasar:

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

Gunakan versi parameterisasi dari fasilitas logging untuk menjaga dari menghasilkan ton sampah gabungan String yang harus diikuti GC. Object[]seperti di atas murah, alokasi tumpukan biasanya.


Dengan penanganan pengecualian, selalu catat rincian pengecualian lengkap:

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

Saya selalu menyampaikan ex.toString()pesan di sini, karena ketika saya " grep -n" untuk " Exception" dalam file log, saya juga bisa melihat pesannya. Jika tidak, itu akan berada pada baris output berikutnya yang dihasilkan oleh dump stack, dan Anda harus memiliki RegEx yang lebih canggih untuk mencocokkan garis itu juga, yang sering memberi Anda lebih banyak output daripada yang perlu Anda perhatikan.

grwww
sumber
3
Apakah ini menulis ke file sejenis. Saya belum bisa menjalankannya di program saya. Saya memiliki garis awal yang Anda miliki tetapi tidak ada yang berhasil sejauh ini.
Doug Hauf
5
Bagaimana Anda melihat log? Pustaka yang saya gunakan menginisialisasi objek Logger dan menggunakan .fine()metode ini untuk mencatat, tapi sepertinya saya tidak dapat membuat pesan ditampilkan ...
Anubian Noob
7
Saya sudah pemrograman di Jawa sejak tahun 1998. Saya selalu menemukan bahwa login di Jawa jauh lebih sulit daripada yang seharusnya. Sejauh ini, inilah penjelasan yang paling mudah tentang cara masuk di Jawa yang telah saya baca. Ringkas juga.
Steve McLeod
30
Sangat menarik bahwa tidak ada yang disebutkan, di mana orang dapat menemukan file log.
Ahmedov
4
Jika Anda ingin tahu ke mana perginya log, pastikan Anda telah mengatur Handler untuk Logger. Untuk hanya mengeluarkan log ke konsol, gunakan ConsoleHandler baru, dan tambahkan ini ke logger Anda menggunakan metode addHandler. Pastikan Anda memanggil setLevel pada pencatat dan penangan.
Craig Brown
67

Seharusnya menyatakan logger seperti ini:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

jadi jika Anda refactor nama kelas Anda itu mengikuti.

Saya menulis artikel tentang java logger dengan contoh di sini .

hanoo
sumber
53

Ada banyak contoh dan juga berbagai jenis untuk logging. Lihatlah paket java.util.logging .

Kode contoh:

import java.util.logging.Logger;

public class Main {

  private static Logger LOGGER = Logger.getLogger("InfoLogging");

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

Tanpa pengodean nama kelas :

import java.util.logging.Logger;

public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}
Ankit
sumber
15
Mengapa tidak menetapkan nama log Main.class.getSimpleName()? Dengan cara ini, alat refactoring akan mengubahnya dengan benar jika diperlukan, namun itu tidak kikuk seperti solusi kedua Anda.
Pijusn
3
Melakukan stacktrace untuk nama logger adalah hack, lambat dan tidak lazim. Itu juga akan merusak dan memberi Anda nama-nama aneh untuk proksi AOP atau pengkodean byte luar biasa lainnya.
Adam Gent
9
-1 untuk bisnis stacktrace. Ini lambat dan berpotensi mencegah optimisasi kompiler.
phooji
4
Mengapa "kelambatan" penting ketika menginisialisasi logger? Sebutan kelambatan adalah apa yang oleh kebanyakan orang disebut optimasi prematur (Ya, kodenya memang terlihat agak meretas).
mikkom
3
@AndrewMcKinlay Dalam situasi apa itu merusakkan apa pun? Jika tag logger seharusnya sama dengan nama kelas, sepertinya baik-baik saja untuk melakukannya. Alat refactoring akan mengganti nama secara otomatis sementara, jika itu adalah string yang dikodekan, alat refactoring dapat melewati itu atau mengatakan "Apakah Anda juga ingin mengubah nama ini?".
Pijusn
23

SLF4J adalah fasad logging yang lebih baik daripada Apache Commons Logging (ACL). Ini memiliki jembatan ke kerangka kerja logging lainnya, membuat panggilan langsung ke ACL, Log4J, atau Java Util Logging melalui SLF4J, sehingga Anda dapat mengarahkan semua output ke satu file log jika Anda mau, hanya dengan satu file konfigurasi log. Mengapa aplikasi Anda menggunakan banyak kerangka kerja pencatatan? Karena perpustakaan pihak ketiga yang Anda gunakan, terutama yang lebih tua, mungkin bisa.

SLF4J mendukung berbagai implementasi logging. Itu dapat menampilkan semuanya ke standar-keluar, menggunakan Log4J, atau Logback (direkomendasikan lebih dari Log4J).

http://www.slf4j.org/

http://logback.qos.ch/

bcody
sumber
9

Saya akan menggunakan minlog , secara pribadi. Ini sangat sederhana, karena kelas logging adalah beberapa ratus baris kode.

Chris Dennett
sumber
3
Untuk jejak minimal, ini adalah perpustakaan untuk dipilih.
h3xStream
0

Saya menyarankan agar Anda menggunakan utilitas log logging milik Apache. Ini sangat scalable dan mendukung file log terpisah untuk penebang yang berbeda. Lihat di sini .

NIKUNJ
sumber
11
Saran yang bagus! namun, cobalah menjawab apa yang mereka minta, jika tidak tinggalkan komentar;)
Ordiel