Penebangan: Mengapa dan Apa? [Tutup]


39

Saya tidak pernah menulis program yang menggunakan logging secara signifikan. Yang paling saya lakukan adalah menangkap jejak stack ketika pengecualian terjadi.

Saya bertanya-tanya, berapa banyak orang yang login? Apakah itu tergantung pada jenis aplikasi yang Anda tulis? Apakah Anda menemukan log sebenarnya bermanfaat?

Jawaban:


24

Untuk pekerjaan yang saya lakukan sebagian besar aplikasi tertanam, masuk alat yang sangat berharga. Setidaknya kesalahan harus dicatat dengan informasi yang cukup untuk menunjukkan baris kode. Selanjutnya, akan menjadi titik fungsi utama di seluruh aplikasi. Hal-hal seperti admin mengakses mesin. Kami menggunakan sistem yang memungkinkan kami untuk memungkinkan lebih banyak logging verbose. Ini biasanya khusus untuk pengembang. Ini dapat digunakan untuk membantu pengembang selama pengujian fitur atau mungkin untuk membantu dalam mendiagnosis masalah pelanggan.

Saya pribadi menggunakan pencatatan di semua aplikasi yang saya kembangkan. Itu selalu mengarah pada pemahaman yang lebih baik tentang aliran aplikasi. Apalagi ketika berada di tangan seorang pelanggan. Mereka tidak pernah (jarang) membatasi kasus penggunaannya untuk orang-orang yang Anda uji.


19

Saya tidak berpikir itu tergantung pada jenis aplikasi: logging berguna di semua aplikasi (non-sepele). Tentu saja, saya kira, ini bisa lebih berguna di beberapa aplikasi daripada yang lain, tapi saya rasa itu tidak pernah berguna .

Secara khusus, dalam kasus kesalahan, jejak tumpukan akan memberi tahu Anda keadaan program pada titik kegagalan yang tepat , tetapi Anda hanya memiliki sedikit petunjuk tentang keadaan tersebut sebelum kesalahan terjadi. Informasi itu bisa sangat berguna dalam melacak masalah, dan penebangan dapat memberikan wawasan yang bermanfaat tentang hal itu. Saya pikir itu adalah sesuatu yang semua, kecuali yang paling sepele, dari program dapat memperoleh manfaat.

Penggunaan logging lainnya, yang mungkin tidak berguna untuk semua program, adalah dalam analisis statistik. Misalnya, server web Anda biasanya mencatat setiap permintaan yang masuk, dan kemudian ada banyak alat yang dapat menganalisis log tersebut dan menghasilkan grafik dari waktu tersibuk Anda, halaman paling populer dan sebagainya. Anda dapat menggunakan data itu untuk melakukan perencanaan kapasitas ("apakah saya perlu server yang lebih besar?") Dan seterusnya.


9

Ada dua alasan dilakukannya penebangan:

  1. Diagnostik
  2. Audit

Logging diagnostik telah didiskusikan oleh orang lain dan saya tidak akan terlalu banyak membahas masalah ini. Saya hanya akan mengatakan Anda harus sangat memikirkan apa yang terjadi jika ada kegagalan log? Apakah Anda cukup peduli untuk melempar pengecualian melalui aplikasi atau mengelolanya dengan cara lain? Ini adalah "tergantung" tetapi mencatat pesan level info mungkin harus dilewati.

Audit logging adalah persyaratan bisnis. Log masuk audit menangkap peristiwa penting dalam sistem dan apa yang diminati manajemen dan elang hukum. Ini adalah hal-hal seperti siapa yang menandatangani sesuatu, siapa yang melakukan apa yang diedit, dll. Sebagai sysadmin atau pengembang memecahkan masalah sistem, Anda mungkin hanya sedikit tertarik pada ini. Namun, dalam banyak kasus logging semacam ini benar-benar merupakan bagian dari transaksi dan harus gagal seluruh transaksi jika tidak dapat diselesaikan.

Memikirkan keduanya secara terpisah sangat membantu bagi saya bukan hanya karena yang satu "opsional" dan yang lain wajib, tetapi karena tergantung pada persyaratan, saya mungkin benar-benar perlu mengimplementasikannya secara terpisah. Ini bisa menjadi kasus (kadang-kadang) bahwa keduanya adalah buah, tetapi satu adalah apel dan jeruk lainnya. Biasanya, satu kerangka logging bisa menangani keduanya.


Kedengarannya seperti perbedaan antara menyimpan buku harian dan menyimpan salinan kontrak sewa Anda.
shuhalo

8

Dalam sebagian besar tugas server, pencatatan sangat penting, karena admin biasanya tidak ada ketika ada hal-hal yang terjadi, jadi ia harus memeriksa fakta.

Tapi, seorang pria di Google pernah mengatakan kepada saya bahwa proses server mereka tidak melakukan pendataan; sebaliknya, mereka 'diinstrumentasi'; itu berarti bahwa setiap proses memiliki kait atau port (dia tidak menentukan mekanika) di mana proses lain dapat menempel untuk meminta parameter, dan statistik. Ini adalah proses pemantauan yang menyimpan banyak hal ke log, keuntungannya adalah bahwa informasi yang mereka peroleh bukan "membuka file", "tulis ini", "ambil itu"; mereka mendapatkan hal-hal seperti "45.453 file terbuka", "653 klien layanan X", "rata-rata respons 344 ms untuk kueri Y"

Tentu saja merupakan pendekatan yang berbeda, dan yang cenderung saya ingat ketika saya mengasuh sistem saya, bahkan jika mereka beberapa pesanan yang lebih kecil.


4

Saya berasal dari aplikasi N-Tiered winforms yang mencatat semuanya.

Itu tidak terlalu berguna.

Tentu, pengecualian logging sangat bagus; tetapi mengapa memasukkan mereka ke mesin klien ketika Anda bisa mengirim email pengecualian ke tim pengembang?

Informasi pencatatan dengan mudah berubah menjadi kecanduan yang nilainya jarang dibenarkan. Untuk setiap situasi di mana Anda dapat login dengan bebas, lebih baik mengumpulkan informasi yang ditargetkan dan mengirimkannya ke tempat yang Anda perlukan.


1
Masih bisakah Anda mengirim email kepada mereka jika aplikasi Anda mogok?
Pemdas

2
Bagaimana jika email tidak aktif?

3
bagaimana jika mesin yang sedang dijalankan tidak memiliki koneksi internet?
Pemdas

2
Saya tidak percaya itu, itulah sebabnya saya menyulitkan Anda. Anda pada dasarnya mengatakan bahwa semua log harus diemail ke tim pengembang, yang seringkali tidak memungkinkan.
Pemdas

3
@Pemdas Sangat sederhana: Di mana Anda dapat melakukannya, lebih baik daripada hanya mau mencatat semuanya dan tidak mengirimkannya kepada siapa pun. Log hanya berarti sesuatu jika seseorang secara teratur memeriksanya, dan hanya jika mereka log cukup untuk menjadi berguna. Terlalu sering saya melihat pengembang mencatat semuanya, dan bahkan tidak melihatnya. Memalukan, sungguh.
George Stocker

4

Menangkap informasi pengecualian adalah suatu keharusan karena dapat sangat membantu sampai batas tertentu. Tetapi kadang-kadang informasi pengecualian tidak cukup terutama jika pengguna aplikasi / klien tidak dapat melaporkan kesalahan dengan informasi yang tepat.

Apakah logging terbatas hanya untuk menangkap informasi kesalahan?

Dalam kasus saya (aplikasi web), saya selalu mencatat halaman mana yang dikunjungi, kapan, apa yang mereka klik, di mana ip & browser, dll. Saya bahkan mencatat total waktu muat untuk setiap kunjungan halaman, sehingga saya bisa tahu halaman mana yang lambat dan perlu optimasi. jadi saya bisa mengatakan bahwa saya login sebanyak mungkin.

pada awalnya, saya tidak tahu seberapa penting hal itu. tetapi ternyata ini sangat membantu dalam banyak hal (selain debugging):

  • memahami perilaku pengguna
  • mengevaluasi penerimaan fitur baru
  • membedakan antara pengadopsi awal, scammer atau pelanggan potensial

Saya pikir, logging bisa menjadi lebih signifikan jika kita suka menggali informasi statistik di dalamnya.


2

Saya seorang pengembang di perusahaan yang produknya digunakan di luar negeri. Ketika tim dukungan datang menanyakan tentang definisi masalah, satu-satunya alat saya untuk diagnosis adalah file log saya dan salinan database pelanggan. Menggunakan database dan lingkungan pengembangan saya, saya memiliki kesempatan untuk mereproduksi kasus yang salah, karena saya mencatat data yang masuk ke modul saya dan tindakan terkait. Jika saya bisa mereproduksi kesalahan dengan bantuan data yang saya kumpulkan, maka saya bisa memperbaikinya dengan debugging. Jika saya tidak memiliki file log, maka saya harus bergantung pada deskripsi pelanggan atau tim pendukung tentang apa yang terjadi dalam kasus apa (yang memiliki peluang besar untuk menyesatkan).

Kedua, logging memberi saya kesempatan untuk mendeteksi kemacetan modul saya di situs yang dikerahkan, karena saya mencatat tanggal & waktu tindakan tertentu dan kemudian saya bisa melihat di mana tindakan menghabiskan banyak waktu.

Selain itu, anggaplah solusi kami terdiri dari 6 modul dan saya melihat log kesalahan dalam file log saya tentang batas waktu basis data. Jika kesalahan ini masuk 5 modul lain juga, maka kemungkinan ini adalah masalah terkait SQL server menjadi lebih besar. Jika ini hanya dicatat dalam modul saya, maka probabilitas bahwa pertanyaan saya bermasalah semakin besar. Saya pikir hal-hal semacam ini adalah indikator yang berguna.

Tentang jenis data apa yang saya lihat di file log saya tergantung pada konfigurasi level log. Jika ini adalah produk baru, kami mengatur level log ke "Semua" untuk mengumpulkan data sebanyak mungkin. Tetapi ketika kami meningkatkan produk, kami mungkin lebih suka menjaga level log pada "Kesalahan" hanya mencatat kesalahan, tetapi tidak pada tingkat informasi log, dll ...


2

Pencatatan berguna untuk informasi yang tidak dapat Anda peroleh dengan program lain:

  • Menangkap jejak tumpukan (Anda mendapatkannya)
  • Tangkap data apa yang sedang diproses saat aplikasi Anda macet. Ingat, debuggers hanya membantu jika mereka hadir ketika crash terjadi.
  • Informasi profil. Jika Anda tidak dapat menjalankan profiler di lingkungan produksi, pencatatan ekstensif termasuk cap waktu dapat membantu Anda mengetahui ke mana perginya waktu. Bahkan tidak dapat memberi tahu dapat membantu Anda mengidentifikasi bahwa itu di luar program Anda (misalnya pengumpulan sampah yang dimulai).
  • Statistik tidak diharapkan saat menulis program. Saya telah diminta untuk memberikan grafik perilaku dari waktu ke waktu untuk interval yang menarik karena alasan lain. Data yang diperlukan dapat diekstraksi dari file log dengan sedikit trik grep + awk + perl ninja.

Catatan: Anda ingin setidaknya dua file log.

  • Satu di tingkat DEBUG - memberikan semua informasi yang dapat Anda bayangkan akan Anda perlukan (termasuk INFO dan yang lebih tinggi). Jika itu terlalu banyak, maka pertimbangkan untuk memiliki level TRACE tambahan.
  • Satu di tingkat INFO - memberikan tinjauan 10.000 meter dari sistem. Tonggak penting di sini.

INFO selalu aktif. DEBUG aktif saat dibutuhkan.

Tulis kode logging untuk mengantisipasi bahwa suatu hari nanti Anda harus men-debug situasi di mana SEMUA yang Anda miliki adalah file log, dan melakukannya dengan benar mungkin merupakan perbedaan antara dipecat dan dipromosikan.

Untuk tambahan, minta semua panggilan fungsi menambahkan parameter mereka ke jejak stack, di Java dengan

public void sendEmail(String sender, String recipient) {
try { 
...
} catch (Exception e) {
  throw new RuntimeException("sendEmail(sender="+sender+", recipient="+recipient+")");
}

Pendekatan ini pada dasarnya meningkatkan tumpukan panggilan Anda dengan nilai parameter, dan dapat memungkinkan Anda untuk menganalisis situasi hanya dengan jejak tumpukan dan tidak harus melihat file log.


+1 untuk "Tulis kode logging yang mengantisipasi bahwa suatu hari nanti Anda harus men-debug situasi di mana SEMUA yang Anda miliki adalah file log, dan melakukannya dengan benar mungkin merupakan perbedaan antara dipecat dan dipromosikan."
Marcie

1

Saya juga merekomendasikan bahwa semua aplikasi non-sepele menggunakan multi-level logging.

Karena alasan yang dinyatakan orang lain, ini adalah alat yang sangat berharga untuk menyelesaikan masalah dengan aplikasi.

Dalam beberapa kasus, pencatatan sangat penting, misalnya dalam aplikasi keuangan dan domain lain yang memerlukan log aktivitas, untuk keamanan, metrik penggunaan, dan audit.


1

Itu pasti tergantung pada jenis sistem yang Anda bangun.

Jika Anda menulis aplikasi desktop yang berdiri sendiri, seperti pengolah kata, maka Anda mungkin tidak perlu login.

Jika Anda menulis sistem tertanam, maka Anda tidak dapat hidup tanpa login. Jika tidak, ketika perangkat tertanam Anda membeku, Anda tidak tahu mengapa. Anda juga perlu masuk setiap kali sistem Anda melibatkan banyak proses atau beberapa mesin fisik yang saling berkomunikasi. Sekali lagi, ketika sistem hang, Anda perlu tahu bagian mana yang mati kapan dan mengapa. Anda harus dapat membandingkan log untuk menentukan apakah data membuatnya melintasi dari satu proses ke proses lainnya. Dengan cara yang sama, Anda perlu mencatat kapan pun sistem Anda dimaksudkan untuk berjalan untuk waktu yang lama tanpa banyak interaksi pengguna langsung.


1

Pencatatan selalu bermanfaat. Tetapi ketika implementasi menyadari itu tidak harus Anda, siapa yang akan membaca log. Mungkin itu semacam admin, pengguna akhir, pelanggan, tim pendukung, ...

Jadi jangan hanya mencatat stacktraces, tetapi juga beberapa informasi tambahan yang dapat diartikan oleh non-pengembang. Ketika aplikasi Anda dikelola oleh beberapa kelompok lain, juga bermanfaat untuk menulis beberapa kode kesalahan unik ke log Anda. Ini dapat memudahkan dukungan, otomatisasi, ...

Poin lain dari perspektif admin: Pikirkan tentang rotasi log.

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.