Apa cara terbaik untuk mengelola kesalahan log untuk pengecualian?

13

pengantar

Jika kesalahan terjadi pada situs web atau sistem, tentu saja berguna untuk mencatatnya, dan menunjukkan pesan sopan kepada pengguna dengan kode referensi untuk kesalahan tersebut.

Dan jika Anda memiliki banyak sistem, Anda tidak ingin informasi ini tersebar - ada baiknya memiliki satu tempat terpusat untuk itu.

Pada level paling sederhana, yang diperlukan hanyalah penambahan id dan dump serial dari detail kesalahan. (Dan mungkin "tempat terpusat" menjadi kotak masuk email.)

Di ujung lain dari spektrum mungkin adalah database yang sepenuhnya dinormalisasi yang juga memungkinkan Anda untuk menekan tombol dan melihat grafik kesalahan per hari, atau mengidentifikasi apa jenis kesalahan yang paling umum pada sistem X adalah, apakah server A memiliki lebih banyak database kesalahan koneksi dari server B, dan sebagainya.

Yang saya maksudkan di sini adalah mencatat kesalahan / pengecualian tingkat kode oleh sistem jarak jauh - bukan pelacakan masalah "berbasis manusia", seperti yang dilakukan dengan Jira, Trac, dll.


Pertanyaan

Saya mencari pemikiran dari pengembang yang telah menggunakan sistem jenis ini, khususnya berkaitan dengan:

  • Apa fitur penting yang tidak dapat Anda lakukan tanpanya?
  • Apa yang baik untuk memiliki fitur yang benar-benar menghemat waktu Anda?
  • Fitur apa yang tampaknya ide yang bagus, tetapi sebenarnya tidak terlalu berguna?

Misalnya, saya akan mengatakan fungsi "tampilkan duplikat" yang mengidentifikasi beberapa kesalahan (tanpa khawatir tentang detail 'tidak penting' yang mungkin berbeda) sangat penting.
Tombol untuk "membuat masalah di [Jira / etc] untuk kesalahan ini" terdengar seperti penghemat waktu yang baik.

Hanya untuk mengulangi, apa yang saya kejar adalah pengalaman praktis dari orang-orang yang telah menggunakan sistem seperti itu, lebih disukai didukung dengan mengapa fitur itu mengagumkan / mengerikan.
(Lagi pula, jika Anda akan berteori, paling tidak tandai jawaban Anda seperti itu.)

Peter Boughton
sumber
2
Satu hal yang perlu diingat: jika Anda mencatat sesuatu, ada yang salah, dan mungkin ada lebih dari satu hal yang salah. Jaga agar tindakan logging tetap sederhana.
David Thornley
masuk pada tingkat debug atau info tidak selalu berarti bahwa ada sesuatu yang salah. Mungkin misalnya berisi informasi yang diperlukan untuk analisis post-mortem.
Saya telah melihat pengecualian penebang yang melemparkan pengecualian pada String.Format (C #) :). Biarkan loggin sederhana, lebih disukai bebas risiko, BUKAN dinamis (mis. Jangan parsing file XML saat Anda mencoba untuk mencatat pengecualian). Hindari dinamisme dalam kesalahan log jika Anda bisa. Jika Anda memiliki hal-hal yang dikonfigurasi dalam file xml, saya pikir lebih baik untuk menghasilkan beberapa kode aktual berdasarkan itu (padat), daripada mengurai file konfigurasi itu pada saat run-time, saat Anda berada di tengah melaporkan kesalahan (dinamis ). Lagipula itu adalah pengalaman saya. Anda mungkin ingin memiliki rencana B untuk logging - jika output mewah gagal, log sederhana
Ayub

Jawaban:

5

Saya telah dalam proyek di mana dengan kesalahan klien yang dicatat menggunakan perpustakaan Microsoft Enterprise . Semua pengecualian tempat kirim ke kotak surat kami. Dalam subjek surat kami menambahkan kode hash kesalahan serial untuk menghindari pesan yang digandakan. Seseorang tentu saja dapat menyimpan pesan berseri dalam database dan sebagainya.

Saya sarankan Anda untuk memeriksa perpustakaan Microsoft Enterprise dan Log4Net .

Beberapa Fitur Log4Net

  • Dukungan untuk banyak kerangka kerja
  • Output ke beberapa target logging
  • Arsitektur pencatatan hierarki
  • Konfigurasi XML
  • Konfigurasi Dinamis
  • Konteks Pencatatan
  • Arsitektur yang terbukti
  • Desain modular dan dapat diperluas • Performa tinggi dengan fleksibilitas
Amir Rezaei
sumber
1
seorang logger yang baik akan membiarkan Anda mendorong kesalahan Anda ke ketekunan pilihan Anda (email, DB, file, dll).
Ken Henderson
1

Dalam kasus aplikasi basis data, beberapa jenis ID (seperti <TABLE>:<PrimaryKeyID>) yang memungkinkan Anda untuk melacak catatan dalam basis data yang terkait dengan ruang lingkup di mana pengecualian ditangkap.

Saya sudah melakukannya dengan Oracle dan PL / SQL, merekam ID dalam tabel database dalam aplikasi, dari handler pengecualian.

Miguel Veloso
sumber
Sangat bagus untuk merekam setidaknya tabel dan rekaman yang sedang diproses. Lebih baik lagi tentu saja memiliki pernyataan SQL yang dicoba (dan parameter apa pun).
Peter Boughton
1

Banyak dari apa yang Anda gambarkan (mis. Bagian khusus logging) diimplementasikan di perpustakaan perusahaan seperti yang dicatat Amir Rezaei. Segala sesuatu yang lain tampaknya lebih merupakan bagian analitik (mis. Apa yang harus dilakukan dengan log sesudahnya).

Dalam kasus saya, saya membuat beberapa aplikasi kecil dan skrip sql yang membuat beberapa hal lebih mudah. Inilah beberapa hal yang sangat saya sukai:

  • Mengelompokkan kesalahan yang sama secara bersamaan (mis. 100 pengguna semuanya mengalami bug yang sama sekitar waktu yang sama adalah 1 laporan bug dengan catatan tentang berapa banyak kejadian yang ada)
  • Mengarsipkan tiket secara otomatis dalam pelacak kasing (tidak pernah berhasil melakukan ini 'dengan mengklik tombol' tetapi selalu ingin melakukannya)
  • Nama pengguna pengguna perangkat lunak (bukan hanya mesin, yang tersedia dengan sebagian besar penebang). Dalam beberapa kasus, akun pengguna otomatis menyebabkan masalah sedangkan dalam kasus lain, pengguna tertentu adalah penyebab masalah. "Aku perlu melihat Mike melakukan pekerjaan, dia terus menyebabkan kesalahan tertentu."
  • "Tindakan Pengguna" - Saya memiliki tumpukan global yang akan menyimpan jejak setiap klik / tombol yang dapat ditindaklanjuti seperti yang dilakukan pengguna dan yang telah menempel pada log kesalahan. Menghasilkan kesalahan seringkali merupakan kasus berjalan melalui jejak itu dan melakukan langkah-langkah yang sama seperti pengguna (saya berharap untuk membangun generator tes CodedUI yang akan mengurai jejak dan melakukan langkah-langkah secara otomatis, tetapi tidak pernah melakukannya)
Steven Evers
sumber
0

Terkadang, informasi log terlalu tebal untuk disimpan pada disk. Satu pendekatan yang saya lihat adalah menulis entri logging Anda ke firehose (dalam, katakanlah, perl) sesuatu seperti ini:

# Create socket.
my $sock = IO::Socket::INET->new(
    Proto       => 'udp',
    PeerAddr    => $bcastaddr,
    Broadcast   => 1,
) or die "Can't create socket ($bcastaddr): $!";

while (<>) {
    chomp;
    unless (/File\ does\ not\ exist:/) {
        $sock->send("$eventtype:$_") or warn "Can't send: $!";
    }
}

kemudian seorang analis dapat memahami apa yang ingin dia lihat.

leed25d
sumber
3
Tidak yakin apa itu 'firehose'? Mengingat kapasitas disk saat ini, saya berharap kesalahan tidak begitu umum sehingga ukuran log akan menjadi masalah.
Peter Boughton
0

Inilah beberapa hal yang saya pelajari dari pemantauan kesalahan dalam aplikasi kami:

  • Mampu mengekor file log bergulir (Saya biasanya menggunakan log4net / log4j untuk masuk aplikasi dan BareTail untuk mengikuti log) sangat berguna untuk dapat memeriksa kesehatan sistem saat ini
  • Untuk mengetahui kapan masalah diperkenalkan dan tingkat terjadinya masalah, ada baiknya Anda memasukkannya ke dalam basis data dengan cap waktu agar Anda dapat menjalankan laporan.
  • Kemampuan untuk mengirim peringatan email / sms / suara sangat membantu dalam memastikan sistem tetap menyala, tetapi Anda harus memiliki kemampuan untuk dengan mudah menyesuaikan jenis kesalahan apa yang mengingatkan Anda. Jika Anda menerima 800 email kesalahan sehari, Anda pasti akan melewatkan satu "Oh tidak, pusat data sedang terbakar".

Saya mendapatkan hasil yang bagus untuk log4net karena membuatnya sangat mudah untuk masuk ke banyak tempat dan membuat perubahan pada konfigurasi logging juga mudah.

aubreyrhodes
sumber
0

elmah adalah sistem pencatatan kesalahan sumber terbuka untuk aplikasi ASP.NET dan dapat ditambahkan ke sistem yang ada (menggunakan NuGet http://nuget.codeplex.com/ ) dengan cepat dan mudah. Ini mendukung berbagai fungsi backend dan notifikasi.

Saya tidak tahu siapa pun yang menambahkannya ke aplikasi desktop karena berjalan sebagai situs web, tetapi tidak ada yang mencegah Anda menjalankannya sebagai layanan dan memposting pengecualian Anda ke sana melalui web.

http://code.google.com/p/elmah/

ELMAH (Modul dan Penangan Kesalahan) adalah fasilitas logging kesalahan di seluruh aplikasi yang sepenuhnya dapat dicolokkan. Itu dapat secara dinamis ditambahkan ke aplikasi web ASP.NET yang berjalan, atau bahkan semua aplikasi web ASP.NET pada mesin, tanpa perlu kompilasi ulang atau penyebaran ulang.

Setelah ELMAH dimasukkan ke dalam aplikasi web yang sedang berjalan dan dikonfigurasikan dengan tepat, Anda mendapatkan fasilitas berikut tanpa mengubah satu baris kode Anda:

  • Pencatatan hampir semua pengecualian tidak tertangani.
  • Halaman web untuk melihat dari jarak jauh seluruh log dari pengecualian yang direkodekan ulang.
  • Halaman web untuk melihat dari jauh rincian lengkap dari satu pengecualian yang dicatat, termasuk jejak tumpukan berwarna.
  • Dalam banyak kasus, Anda dapat meninjau layar kuning asli kematian yang dihasilkan ASP.NET untuk pengecualian tertentu, bahkan dengan customErrorsmode dimatikan.
  • Pemberitahuan email tentang setiap kesalahan pada saat itu terjadi.
  • Umpan RSS dari 15 kesalahan terakhir dari log ...
Bil Simser
sumber
ELMAH tidak bisa diandalkan. Jika httpcontext NULL ==> boom
Quandary
@ Pertanyaan Saya ingin tahu apakah saya melewatkan sesuatu? Kami melihat kesalahan ketika mencoba masuk ke ELMAH dari aplikasi dan HttpContext adalah nol, tetapi jika Anda memiliki tangkapan level root -> membuat elmah logger baru dengan konteks dan log nol, maka itu berfungsi dengan baik. Apakah ada tempat di situs web ASP.NET normal yang mungkin mencoba dan masuk dan HttpContext adalah nol?
Ian Grainger