Aturan dan saran untuk logging?


13

Di organisasi saya, kami telah mengumpulkan beberapa aturan / guildeline tentang pencatatan yang ingin saya ketahui jika Anda dapat menambahkan atau berkomentar.

Kami menggunakan Java tetapi Anda dapat berkomentar secara umum tentang loggin - aturan dan saran

  1. Gunakan level logging yang benar

    • GALAT: Ada yang salah dan perlu segera diperbaiki
    • PERINGATAN: Proses dapat berlanjut tanpa memperbaiki. Aplikasi harus mentolerir level ini tetapi peringatan harus selalu diselidiki.
    • INFO: Informasi bahwa proses penting selesai
    • DEBUG. Hanya digunakan selama pengembangan
  2. Pastikan Anda tahu apa yang Anda masuk.

  3. Hindari penebangan yang memengaruhi perilaku aplikasi

Fungsi pencatatan harus untuk menulis pesan dalam log.

  1. Pesan log harus deskriptif, jelas, singkat dan ringkas.

Tidak ada banyak penggunaan pesan omong kosong saat pemecahan masalah.

  1. Masukkan properti yang tepat di log4j

Masukkan bahwa metode dan kelas yang tepat ditulis secara otomatis.

Contoh:

Datedfile -web

log4j.rootLogger=ERROR, DATEDFILE
log4j.logger.org.springframework=INFO
log4j.logger.waffle=ERROR
log4j.logger.se.prv=INFO
log4j.logger.se.prv.common.mvc=INFO
log4j.logger.se.prv.omklassning=DEBUG

log4j.appender.DATEDFILE=biz.minaret.log4j.DatedFileAppender
log4j.appender.DATEDFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATEDFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}.%M] - %m%n

log4j.appender.DATEDFILE.Prefix=omklassning.
log4j.appender.DATEDFILE.Suffix=.log
log4j.appender.DATEDFILE.Directory=//localhost/WebSphereLog/omklassning/
  1. Nilai log.

Harap catat nilai dari aplikasi.

  1. Awalan log.

Nyatakan bagian mana dari aplikasi yang digunakan untuk log in, lebih disukai dengan sesuatu untuk awalan yang disetujui misalnya proyek PANDORA_DB

  1. Jumlah teks.

Berhati-hatilah agar tidak ada terlalu banyak pencatatan teks. Ini dapat mempengaruhi kinerja aplikasi.

  1. Format penebangan:

-Ada beberapa varian dan metode untuk digunakan dengan log4j tetapi kami ingin menggunakan format yang seragam secara seragam, ketika kami masuk dengan pengecualian:

logger.error("PANDORA_DB2: Fel vid hämtning av frist i TP210_RAPPORTFRIST", e);

Dalam contoh di atas diasumsikan bahwa kita telah menetapkan properti log4j sehingga secara otomatis menulis kelas dan metode.

Selalu gunakan logger dan bukan yang berikut:

System.out.println(), System.err.println(), e.printStackTrace()

Jika aplikasi web menggunakan framework kami, Anda bisa mendapatkan informasi kesalahan yang sangat terperinci dari EJB, jika menggunakan try-catch di handler dan masuk sesuai dengan model di atas:

Dalam proyek kami, kami menggunakan pola konversi ini dengan metode dan nama kelas mana yang ditulis secara otomatis. Di sini kami menggunakan dua pattents berbeda untuk konsol dan untuk file datefile:

log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.DATEDFILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

Baik dalam contoh di atas metode dan kelas wioll dituliskan. Di nomor baris konsol juga akan ditulis.

  1. toString()

Silakan memiliki toString()untuk setiap objek. EX:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(" DwfInformation [ ");
  sb.append("cc: ").append(cc);
  sb.append("pn: ").append(pn);
  sb.append("kc: ").append(kc);
  sb.append("numberOfPages: ").append(numberOfPages);
  sb.append("publicationDate: ").append(publicationDate);
  sb.append("version: ").append(version);
  sb.append(" ]");
  return sb.toString();
}

bukannya metode khusus yang membuat output ini

public void printAll()
{
    logger.info("inbet: " + getInbetInput());
    logger.info("betdat: " + betdat);
    logger.info("betid: " + betid);
    logger.info("send: " + send);
    logger.info("appr: " + appr);
    logger.info("rereg: " + rereg);   
    logger.info("NY: " + ny);   
    logger.info("CNT: " + cnt);   
}

Jadi, adakah yang bisa Anda tambahkan, komentari, atau temukan dipertanyakan dengan cara-cara menggunakan pencatatan ini? Merasa bebas untuk menjawab atau berkomentar walaupun itu tidak terkait dengan Java, Java dan log4j hanyalah implementasi dari bagaimana hal ini beralasan.



1
@gnat - Saya pikir Anda benar, ada banyak tumpang tindih antara dua pertanyaan. Saya berjuang untuk menyebutnya duplikat.

Jawaban:


4

Sebagai perpanjangan dari aturan logging Anda di mana dalam aplikasi pernyataan log berasal, Anda mungkin ingin menambahkan per flag logging level modul. Alih-alih mencatat semuanya, sepanjang waktu, ini memungkinkan Anda untuk secara selektif menargetkan bagian dari aplikasi Anda. Ada overhead dalam hal ini, dan Anda perlu membuat fasilitas yang memungkinkan Anda untuk mengaktifkan / menonaktifkan logging itu. Idealnya, Anda dapat mengaktifkan / menonaktifkan on-the-fly saat aplikasi sedang berjalan.

Saya terbiasa melihat lapisan di bawah debug yang saya sebut "Jejak", tapi itu belum tentu istilah universal. Trek logging level "Trace" sebanyak yang Anda bisa berdiri, termasuk entri / keluar modul, cap waktu dengan entri / keluar, dan poin bonus untuk menangkap nilai yang diteruskan. Jelas, itu menghasilkan BANYAK data dan itu bukan sesuatu yang Anda nyalakan mau tak mau. Tetapi memiliki kelebihan sehubungan dengan debugging ketika Anda tidak dapat melampirkan ke proses atau Anda tidak memiliki dump inti dari aplikasi yang salah.

Saya suka melihat referensi file / modul dan cap waktu dengan informasi log saya. Ini bisa berguna ketika mencoba untuk memburu kondisi balapan di antara utas serta mengkoordinasikan kegiatan beberapa area aplikasi. Agar adil, saya tahu beberapa orang yang berpikir rincian ini mengacaukan file log. Menambahkan cap waktu adalah sesuatu untuk didiskusikan dengan tim. (Permintaan maaf jika log4j sudah melakukan itu.)

Jika penebangan tidak diurus oleh utasnya sendiri / proses, itu sesuatu yang perlu dipertimbangkan juga. Alih-alih membuat utas aplikasi menunggu proses logging, pesan log diteruskan ke penangan log dan utas aplikasi berjalan dengan cara yang menyenangkan. Atau, membuat semacam mekanisme buffer untuk menangani pesan log adalah cara lain untuk mempercepat respons aplikasi.

Memiliki kontrol pada ukuran dan riwayat file log adalah fitur lain yang perlu dipertimbangkan. Anda tidak ingin aplikasi menghapus semua ruang disk pada sistem host, Anda juga tidak perlu menyimpan semua file log untuk selamanya.


2

Satu hal yang perlu diingat adalah memeriksa level logging sebelum Anda melakukan operasi string apa pun untuk logging. Yaitu, jangan pergi ke semua pekerjaan pengaturan formatter tanggal atau merangkai sekelompok string untuk membuat pesan log jika Anda tidak benar-benar akan login itu. Itu hanya pekerjaan sia-sia yang memperlambat aplikasi Anda.

FYI, proyek Apache Commons memiliki ToStringBuilder kelas yang menyederhanakan membuat toString()metode Anda .


1

Saya tidak menemukan sesuatu yang dipertanyakan dalam apa yang Anda tambahkan di sini Nick. Beginilah cara saya melakukannya selama beberapa waktu. Posting yang Anda berikan sangat rinci dan mungkin dapat digunakan sebagai semacam tutorial untuk masuk. Namun, saya ingin menambahkan satu hal di sini, yaitu: Di banyak tempat, saya telah melihat bab menggunakan logging bersyarat, misalnya:

     if(env_local)
     {
     write_to_local();
     }    
     else if(env_IT)
     {
     write_to_IT();
     } 
     else if(env_PROD)
     {
     write_to_prod();
     } 
     else
     dosomething();

Saya pikir jenis ini tracing tracing atau debugging bukan cara terbaik untuk pergi.


1

Selain mencatat Kelas / Metode yang meningkatkan kesalahan, akan berguna untuk juga mencatat parameter yang dilewatkan ke metode itu. Mengetahui di mana kesalahan muncul tidak terlalu berguna jika hanya terjadi 1 kali dari 1000; Anda juga perlu tahu data apa yang menyebabkan kesalahan terjadi.

Saya juga merasa bermanfaat untuk memiliki variabel yang menentukan tingkat default logging untuk suatu aplikasi. Dengan begitu Anda dapat memiliki kode DEBUG dan INFO bersama kode PERINGATAN dan KESALAHAN. Saat berjalan dalam mode produksi, Anda defaultkan untuk tidak menampilkan info DEBUG, tetapi ketika bug muncul Anda dapat memperbarui bendera dan mulai menulis pesan DEBUG ke log juga.


1

Penebangan seringkali menjadi masalah lintas sektoral. Java saja tidak cukup ekspresif untuk membuat Anda dapat memisahkan logging dari logika bisnis Anda yang sebenarnya. Ini berarti Anda tidak bisa, misalnya, hanya mengambil satu metode dan memasukkannya ke proyek lain, tetapi Anda harus menghapus dan menyesuaikan semua pencatatan sebelum Anda melakukannya. Dan itu hanyalah puncak gunung es.

Untuk mencegah hal itu dan masalah-masalah lain ketika menyatu dengan logging dan logika bisnis "nyata" Anda harus mempertimbangkan menggunakan pemrograman berorientasi aspek. Untuk Java, kerangka kerja yang paling banyak digunakan adalah AspectJ. Ada video youtube ini dari pembicaraan teknologi google yang menjelaskan AspectJ dan penggunaannya di luar penebangan dengan cukup baik. Anda akan menemukan banyak contoh untuk login sendiri tentu saja di sini di stackexchange juga .


0

Satu hal yang saya sarankan adalah Anda memiliki sarana untuk memiliki beberapa konteks logging yang terkait dengan file log tertentu, dan mengatur agar segala sesuatu yang ditulis untuk konteks logging apa pun akan dicatat kecuali kode secara eksplisit meminta konteks logging untuk membuang kontennya. Desain seperti itu akan memungkinkan seseorang untuk menangkap log yang agak rinci selama operasi dan membuangnya jika operasi berhasil, tetapi tersedia jika operasi gagal. Tidak ada fitur pencatatan seperti itu, memiliki log yang baik tersedia ketika sesuatu gagal mungkin mengharuskan aplikasi menghabiskan banyak waktu untuk mencatat data yang tidak berguna dalam 99,99% saat semuanya bekerja.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.