Apa konfigurasi terbaik atau paling berguna untuk masuk dengan NLog? (Ini bisa sederhana atau kompleks, asalkan berguna.)
Saya sedang memikirkan contoh-contoh seperti secara otomatis menggulir file log pada ukuran tertentu, mengubah tata letak (pesan log) apakah ada pengecualian, meningkatkan level log setelah kesalahan terjadi, dll.
Berikut ini beberapa tautan:
Jawaban:
Beberapa di antaranya masuk dalam kategori tips NLog (atau logging) umum daripada saran konfigurasi yang ketat.
Berikut adalah beberapa tautan logging umum dari sini di SO (Anda mungkin telah melihat beberapa atau semua ini sudah):
log4net vs. Nlog
Mencatat praktik terbaik
Apa gunanya fasad logging?
Mengapa logger merekomendasikan menggunakan logger per kelas?
Gunakan pola umum penamaan logger Anda berdasarkan kelas
Logger logger = LogManager.GetCurrentClassLogger()
. Ini memberi Anda tingkat granularitas tinggi dalam logger Anda dan memberi Anda fleksibilitas besar dalam konfigurasi logger (kontrol secara global, dengan namespace, dengan nama logger tertentu, dll).Gunakan penebang berbasis non-classname yang sesuai. Mungkin Anda memiliki satu fungsi yang ingin Anda kendalikan secara terpisah. Mungkin Anda memiliki masalah penebangan lintas sektoral (pencatatan kinerja).
Jika Anda tidak menggunakan logging berbasis nama-kelas, pertimbangkan untuk memberi nama penebang Anda dalam beberapa jenis struktur hierarkis (mungkin berdasarkan area fungsional) sehingga Anda dapat mempertahankan fleksibilitas yang lebih besar dalam konfigurasi Anda. Misalnya, Anda mungkin memiliki area fungsional "basis data", FA "analisis", dan FA "ui". Masing-masing mungkin memiliki sub-area. Jadi, Anda dapat meminta penebang seperti ini:
Dan seterusnya. Dengan hierarki logger, Anda dapat mengonfigurasi logging secara global ("*" atau root logger), oleh FA (Database, Analisis, UI), atau dengan subarea (Database.Connect, dll).
Penebang memiliki banyak opsi konfigurasi:
Lihat bantuan NLog untuk informasi lebih lanjut tentang apa arti masing-masing opsi. Mungkin item yang paling penting di sini adalah kemampuan untuk wildcard logger rules, konsep bahwa beberapa aturan logger dapat "mengeksekusi" untuk pernyataan logging tunggal, dan bahwa aturan logger dapat ditandai sebagai "final" sehingga aturan selanjutnya tidak akan dijalankan untuk diberikan pernyataan logging.
Gunakan GlobalDiagnosticContext, MappedDiagnosticContext, dan NestedDiagnosticContext untuk menambahkan konteks tambahan pada output Anda.
Gunakan "variabel" dalam file konfigurasi Anda untuk menyederhanakan. Misalnya, Anda dapat menentukan variabel untuk tata letak Anda dan kemudian merujuk variabel dalam konfigurasi target daripada menentukan tata letak secara langsung.
Atau, Anda bisa membuat set properti "khusus" untuk ditambahkan ke tata letak.
Atau, Anda dapat melakukan hal-hal seperti membuat penyaji tata letak "hari" atau "bulan" secara ketat melalui konfigurasi:
Anda juga dapat menggunakan renders tata letak untuk mendefinisikan nama file Anda:
Jika Anda menggulung file setiap hari, setiap file dapat dinamai "Monday.log", "Tuesday.log", dll.
Jangan takut untuk menulis penyaji tata letak Anda sendiri. Mudah dan memungkinkan Anda untuk menambahkan informasi konteks Anda sendiri ke file log melalui konfigurasi. Misalnya, berikut adalah penyaji tata letak (berdasarkan NLog 1.x, bukan 2.0) yang dapat menambahkan Trace.CorrelationManager.ActivityId ke log:
Beri tahu NLog di mana ekstensi NLog Anda (seperti apa rakitan) seperti ini:
Gunakan renderer tata letak khusus seperti ini:
Gunakan target async:
Dan pembungkus target default:
jika perlu. Lihat NLog docs untuk info lebih lanjut tentang mereka.
Beri tahu NLog untuk menonton dan memuat ulang konfigurasi secara otomatis jika berubah:
Ada beberapa opsi konfigurasi untuk membantu mengatasi masalah NLog
Lihat Bantuan NLog untuk info lebih lanjut.
NLog 2.0 menambahkan pembungkus LayoutRenderer yang memungkinkan pemrosesan tambahan dilakukan pada output dari penyaji tata letak (seperti memangkas spasi putih, huruf besar, huruf kecil, dll.).
Jangan takut untuk membungkus logger jika Anda ingin melindungi kode Anda dari ketergantungan keras pada NLog, tetapi bungkus dengan benar. Ada beberapa contoh bagaimana membungkus repositori github NLog. Alasan lain untuk membungkus mungkin karena Anda ingin secara otomatis menambahkan informasi konteks spesifik untuk setiap pesan yang dicatat (dengan memasukkannya ke LogEventInfo.Context).
Ada pro dan kontra untuk membungkus (atau abstrak) NLog (atau kerangka kerja logging lainnya dalam hal ini). Dengan sedikit usaha, Anda dapat menemukan banyak info di sini di SO menyajikan kedua belah pihak.
Jika Anda mempertimbangkan untuk membungkus, pertimbangkan untuk menggunakan Common.Logging . Ini berfungsi dengan cukup baik dan memungkinkan Anda untuk dengan mudah beralih ke kerangka kerja pencatatan yang lain jika Anda ingin melakukannya. Juga jika Anda mempertimbangkan untuk membungkus, pikirkan tentang bagaimana Anda akan menangani objek konteks (GDC, MDC, NDC). Common.Logging saat ini tidak mendukung abstraksi untuk mereka, tetapi seharusnya dalam antrian kemampuan untuk menambahkan.
sumber
NewLine
tata letak menyelesaikan tugas. Inilah yang saya pikirkan. Ini pasti jauh lebih sederhana daripada yang saya harapkan.Memperlakukan pengecualian secara berbeda
Kami sering ingin mendapatkan informasi lebih lanjut ketika ada pengecualian. Konfigurasi berikut memiliki dua target, file dan konsol, yang memfilter apakah ada info pengecualian atau tidak. (EDIT: Jarek telah memposting tentang metode baru untuk melakukan ini di vNext .)
Kuncinya adalah memiliki target pembungkus
xsi:type="FilteringWrapper" condition="length('${exception}')>0"
sumber
condition="length('${exception}')=0
(atau mungkin itu==
) ketarget name="file"
.Rupanya, Anda sekarang dapat menggunakan NLog dengan Growl untuk Windows .
sumber
Konfigurasikan NLog via XML, tetapi secara terprogram
Apa? Tahukah Anda bahwa Anda dapat menentukan NLog XML langsung ke NLog dari aplikasi Anda, dan bukannya NLog membacanya dari file konfigurasi? Anda bisa. Katakanlah Anda memiliki aplikasi terdistribusi dan Anda ingin menggunakan konfigurasi yang sama di mana-mana. Anda dapat menyimpan file konfigurasi di setiap lokasi dan memeliharanya secara terpisah, Anda bisa menyimpannya di lokasi pusat dan mendorongnya ke lokasi satelit, atau Anda mungkin bisa melakukan banyak hal lainnya. Atau, Anda bisa menyimpan XML dalam database, mendapatkannya di startup aplikasi, dan mengonfigurasi NLog langsung dengan XML itu (mungkin memeriksa kembali secara berkala untuk melihat apakah sudah berubah).
Saya tidak yakin seberapa kuat ini, tetapi contoh ini memberikan titik awal yang berguna bagi orang-orang yang mungkin ingin mencoba mengonfigurasi seperti ini.
sumber
<?xml version='1.0' encoding='utf-8' ?><nlog xmlns='http://nlog-project.org/schemas/NLog.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
Mencatat level yang berbeda tergantung pada ada tidaknya kesalahan
Contoh ini memungkinkan Anda untuk mendapatkan informasi lebih lanjut ketika ada kesalahan dalam kode Anda. Pada dasarnya, buffer pesan dan hanya output yang pada tingkat log tertentu (misalnya Peringatkan) kecuali kondisi tertentu terpenuhi (misalnya ada kesalahan, sehingga tingkat log adalah> = Kesalahan), maka itu akan menampilkan lebih banyak info (misalnya semua pesan dari tingkat log> = Lacak). Karena pesan di buffer, ini memungkinkan Anda mengumpulkan informasi tentang apa yang terjadi sebelum Kesalahan atau ErrorException dicatat - sangat berguna!
Saya mengadaptasi yang ini dari contoh di kode sumber . Saya dilempar pada awalnya karena saya meninggalkan
AspNetBufferingWrapper
(karena saya bukan aplikasi ASP) - ternyata PostFilteringWrapper membutuhkan beberapa target buffered. Perhatikan bahwatarget-ref
elemen yang digunakan dalam contoh yang ditautkan di atas tidak dapat digunakan di NLog 1.0 (Saya menggunakan 1.0 Refresh untuk aplikasi .NET 4.0); Anda harus meletakkan target di dalam blok pembungkus. Perhatikan juga bahwa sintaks logika (yaitu simbol lebih besar atau lebih kecil dari, <dan>) harus menggunakan simbol, bukan XML yang lolos untuk simbol tersebut (yaitu>
dan<
) atau NLog akan kesalahan.app.config:
sumber
fileAsCsv
Target-ref hanyalah artefak dari pengujian saya. Saya percaya NLog 2 memiliki / memiliki masalah dengan CsvLayouts yang tidak dimiliki NLog 1 / Refresh.Saya memberikan beberapa jawaban yang cukup menarik untuk pertanyaan ini:
Nlog - Membuat Bagian Header untuk file log
Menambahkan Header:
Pertanyaannya ingin tahu bagaimana cara menambahkan header ke file log. Menggunakan entri konfigurasi seperti ini memungkinkan Anda untuk menentukan format header secara terpisah dari format sisa entri log. Gunakan logger tunggal, mungkin disebut "headerlogger" untuk mencatat satu pesan di awal aplikasi dan Anda mendapatkan header Anda:
Tentukan tajuk dan tata letak file:
Tentukan target menggunakan tata letak:
Tentukan penebang:
Tulis tajuknya, mungkin di awal program:
Ini sebagian besar hanyalah versi lain dari gagasan "Memperlakukan pengecualian secara berbeda".
Log setiap tingkat log dengan tata letak yang berbeda
Demikian pula, poster ingin tahu cara mengubah format per level logging. Tidak jelas bagi saya apa tujuan akhirnya (dan apakah tujuan itu dapat dicapai dengan cara yang "lebih baik"), tetapi saya dapat memberikan konfigurasi yang melakukan apa yang dia minta:
Sekali lagi, sangat mirip dengan Memperlakukan pengecualian secara berbeda .
sumber
GlobalDiagnosticsContext
sebelumnya.Masuk ke Twitter
Berdasarkan posting ini tentang App4 Twitter Twitter, Saya pikir saya akan mencoba menulis NLog Twitter Target (menggunakan refresh NLog 1.0, bukan 2.0). Sayangnya, sejauh ini saya belum bisa mendapatkan Tweet untuk benar-benar memposting. Saya tidak tahu apakah ada yang salah dalam kode saya, Twitter, koneksi internet / firewall perusahaan kami, atau apa. Saya memposting kode di sini jika seseorang tertarik untuk mencobanya. Perhatikan bahwa ada tiga metode "Posting" yang berbeda. Yang pertama saya coba adalah PostMessageToTwitter. PostMessageToTwitter pada dasarnya sama dengan PostLoggingEvent di postingan orignal. Jika saya menggunakan itu saya mendapatkan pengecualian 401. PostMessageBasic mendapatkan pengecualian yang sama. PostMessage berjalan tanpa kesalahan, tetapi pesannya tetap tidak sampai ke Twitter. PostMessage dan PostMessageBasic didasarkan pada contoh yang saya temukan di SO.
FYI - Saya baru saja menemukan komentar oleh @Jason Diller untuk jawaban dalam posting ini yang mengatakan bahwa twitter akan mematikan otentikasi dasar "bulan depan". Ini kembali pada Mei 2010 dan sekarang Desember 2010, jadi saya kira itu bisa jadi mengapa ini tidak berhasil.
Konfigurasikan seperti ini:
Beri tahu NLog majelis yang berisi target:
Konfigurasikan target:
Jika seseorang mencoba ini dan berhasil, kirim kembali dengan temuan Anda.
sumber
Cara yang Lebih Mudah Untuk Log setiap tingkat log dengan tata letak yang berbeda menggunakan Tata Letak Bersyarat
Lihat https://github.com/NLog/NLog/wiki/When-Filter untuk sintaksis
sumber
Pelaporan ke situs web / basis data eksternal
Saya ingin cara sederhana dan otomatis melaporkan kesalahan (karena pengguna sering tidak) dari aplikasi kami. Solusi termudah yang bisa saya buat adalah URL publik - halaman web yang dapat mengambil input dan menyimpannya ke database - yang mengirim data pada kesalahan aplikasi. (Basis data kemudian dapat diperiksa oleh dev atau skrip untuk mengetahui apakah ada kesalahan baru.)
Saya menulis halaman web dalam PHP dan membuat database mysql, pengguna, dan tabel untuk menyimpan data. Saya memutuskan empat variabel pengguna, id, dan cap waktu. Variabel yang mungkin (baik termasuk dalam URL atau sebagai data POST) adalah:
app
(nama aplikasi)msg
(pesan - mis. Pengecualian terjadi ...)dev
(pengembang - mis. Pat)src
(sumber - ini akan datang dari variabel yang berkaitan dengan mesin tempat aplikasi berjalan, misalnyaEnvironment.MachineName
atau semacamnya)log
(file log atau pesan verbal)(Semua variabel bersifat opsional, tetapi tidak ada yang dilaporkan jika tidak ada yang disetel - jadi jika Anda hanya mengunjungi URL situs web, tidak ada yang dikirim ke db.)
Untuk mengirim data ke URL, saya menggunakan
WebService
target NLog . (Catatan, saya punya beberapa masalah dengan target ini pada awalnya. Tidak sampai saya melihat sumber yang saya tahu bahwa sayaurl
tidak bisa berakhir dengan a/
.)Secara keseluruhan, ini bukan sistem yang buruk untuk mengawasi aplikasi eksternal. (Tentu saja, hal yang sopan untuk dilakukan adalah memberi tahu pengguna Anda bahwa Anda akan melaporkan data yang mungkin sensitif dan memberi mereka cara untuk memilih masuk / keluar.)
Hal-hal MySQL
(Pengguna db hanya memiliki
INSERT
hak istimewa pada tabel ini dalam database sendiri.)Kode situs web
(PHP 5.3 atau 5.2 dengan PDO diaktifkan , file ada
index.php
di/report
folder)Kode aplikasi (file konfigurasi NLog)
Catatan: mungkin ada beberapa masalah dengan ukuran file log, tapi saya belum menemukan cara sederhana untuk memotongnya (mis.
tail
Perintah a la * nix's ).sumber
url
: InnerException: System.InvalidCastException Pesan = Pemain tidak valid dari 'System.String' ke 'System.Uri'. Sumber = mscorlib StackTrace: at System.Convert.DefaultToType (Nilai IConvertible, Ketik targetType, penyedia IFormatProvider) di System.String.System.IConvertible.ToType (tipe Type, penyedia IFormatProvider) di System.Convert.ChangeType (Nilai objek, jenis konversiType , Penyedia IFormatProvider)Log dari Silverlight
Saat menggunakan NLog dengan Silverlight Anda dapat mengirim jejak ke sisi server melalui layanan web yang disediakan . Anda juga dapat menulis ke file lokal di Penyimpanan Terpencil, yang berguna jika server web tidak tersedia. Lihat di sini untuk detailnya, yaitu gunakan sesuatu seperti ini untuk menjadikan diri Anda target:
sumber