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:
Logger logger = LogManager.GetLogger("Database.Connect");
Logger logger = LogManager.GetLogger("Database.Query");
Logger logger = LogManager.GetLogger("Database.SQL");
Logger logger = LogManager.GetLogger("Analysis.Financial");
Logger logger = LogManager.GetLogger("Analysis.Personnel");
Logger logger = LogManager.GetLogger("Analysis.Inventory");
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:
<logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" />
<logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" />
<logger name="Name.Space.*" writeTo="f3,f4" />
<logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" />
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.
<variable name="brief" value="${longdate} | ${level} | ${logger} | ${message}"/>
<variable name="verbose" value="${longdate} | ${machinename} | ${processid} | ${processname} | ${level} | ${logger} | ${message}"/>
<targets>
<target name="file" xsi:type="File" layout="${verbose}" fileName="${basedir}/${shortdate}.log" />
<target name="console" xsi:type="ColoredConsole" layout="${brief}" />
</targets>
Atau, Anda bisa membuat set properti "khusus" untuk ditambahkan ke tata letak.
<variable name="mycontext" value="${gdc:item=appname} , ${mdc:item=threadprop}"/>
<variable name="fmt1withcontext" value="${longdate} | ${level} | ${logger} | [${mycontext}] |${message}"/>
<variable name="fmt2withcontext" value="${shortdate} | ${level} | ${logger} | [${mycontext}] |${message}"/>
Atau, Anda dapat melakukan hal-hal seperti membuat penyaji tata letak "hari" atau "bulan" secara ketat melalui konfigurasi:
<variable name="day" value="${date:format=dddd}"/>
<variable name="month" value="${date:format=MMMM}"/>
<variable name="fmt" value="${longdate} | ${level} | ${logger} | ${day} | ${month} | ${message}"/>
<targets>
<target name="console" xsi:type="ColoredConsole" layout="${fmt}" />
</targets>
Anda juga dapat menggunakan renders tata letak untuk mendefinisikan nama file Anda:
<variable name="day" value="${date:format=dddd}"/>
<targets>
<target name="file" xsi:type="File" layout="${verbose}" fileName="${basedir}/${day}.log" />
</targets>
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:
[LayoutRenderer("ActivityId")]
class ActivityIdLayoutRenderer : LayoutRenderer
{
int estimatedSize = Guid.Empty.ToString().Length;
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
builder.Append(Trace.CorrelationManager.ActivityId);
}
protected override int GetEstimatedBufferSize(LogEventInfo logEvent)
{
return estimatedSize;
}
}
Beri tahu NLog di mana ekstensi NLog Anda (seperti apa rakitan) seperti ini:
<extensions>
<add assembly="MyNLogExtensions"/>
</extensions>
Gunakan renderer tata letak khusus seperti ini:
<variable name="fmt" value="${longdate} | ${ActivityId} | ${message}"/>
Gunakan target async:
<nlog>
<targets async="true">
<!-- all targets in this section will automatically be asynchronous -->
</targets>
</nlog>
Dan pembungkus target default:
<nlog>
<targets>
<default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>
<target name="f1" xsi:type="File" fileName="f1.txt"/>
<target name="f2" xsi:type="File" fileName="f2.txt"/>
</targets>
<targets>
<default-wrapper xsi:type="AsyncWrapper">
<wrapper xsi:type="RetryingWrapper"/>
</default-wrapper>
<target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>
<target name="n2" xsi:type="Network" address="tcp://localhost:4002"/>
<target name="n3" xsi:type="Network" address="tcp://localhost:4003"/>
</targets>
</nlog>
jika perlu. Lihat NLog docs untuk info lebih lanjut tentang mereka.
Beri tahu NLog untuk menonton dan memuat ulang konfigurasi secara otomatis jika berubah:
<nlog autoReload="true" />
Ada beberapa opsi konfigurasi untuk membantu mengatasi masalah NLog
<nlog throwExceptions="true" />
<nlog internalLogFile="file.txt" />
<nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" />
<nlog internalLogToConsole="false|true" />
<nlog internalLogToConsoleError="false|true" />
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.