Bunlardan bazıları, kesinlikle yapılandırma önerileri yerine genel NLog (veya günlük kaydı) ipuçları kategorisine girer.
Burada SO'daki bazı genel günlük bağlantıları aşağıdadır (bunların bir kısmını veya tümünü zaten görmüş olabilirsiniz):
log4net ve Nlog karşılaştırması
Günlüğe kaydetme en iyi uygulamaları
Ahşap bir cephenin anlamı nedir?
Kaydediciler neden sınıf başına bir günlükçünün kullanılmasını önerir?
Logger'ınızı sınıfa göre adlandırmanın ortak şeklini kullanın Logger logger = LogManager.GetCurrentClassLogger()
. Bu, günlükçülerinizde yüksek derecede ayrıntı düzeyi sağlar ve günlükçülerin yapılandırılmasında büyük esneklik sağlar (küresel olarak, ad alanına göre, belirli günlükçü adına göre kontrol edin).
Uygun olduğunda, sınıf adı tabanlı olmayan günlükçüler kullanın. Belki de günlüğe kaydetmeyi ayrı ayrı kontrol etmek istediğiniz bir işleve sahipsiniz. Belki bazı kesişen kayıt kaygılarınız var (performans günlüğü).
Classname tabanlı günlük kaydı kullanmıyorsanız, yapılandırmanızda daha fazla esneklik sağlayabilmeniz için günlüklerinizi bir tür hiyerarşik yapıda (belki de işlevsel alana göre) adlandırmayı düşünün. Örneğin, bir "veritabanı" işlev alanı, bir "analiz" FA ve "ui" FA olabilir. Bunların her birinin alt alanları olabilir. Yani, bunun gibi günlükçüler talep edebilirsiniz:
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");
Ve bunun gibi. Hiyerarşik kaydedicilerle günlük kaydını global olarak ("*" veya kök kaydedici), FA (Veritabanı, Analiz, UI) veya alt bölge (Database.Connect vb.) İle yapılandırabilirsiniz.
Kaydedicilerin birçok yapılandırma seçeneği vardır:
<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" />
Seçeneklerin her birinin tam olarak ne anlama geldiğiyle ilgili daha fazla bilgi için NLog yardımına bakın . Muhtemelen buradaki en dikkate değer öğeler, günlükçü kurallarını joker karakterlere çevirme yeteneğidir, birden çok günlükçü kuralının tek bir günlük ifadesi için "yürütebildiği" ve bir günlükçü kuralının "son" olarak işaretlenebileceği, böylece sonraki kuralların günlük kaydı ifadesi.
Çıktınıza ek bağlam eklemek için GlobalDiagnosticContext, MappedDiagnosticContext ve NestedDiagnosticContext öğelerini kullanın.
Basitleştirmek için yapılandırma dosyanızda "değişken" kullanın. Örneğin, mizanpajlarınız için değişkenler tanımlayabilir ve ardından düzeni doğrudan belirtmek yerine, hedef yapılandırmadaki değişkene başvurabilirsiniz.
<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>
Veya bir düzene eklemek üzere "özel" özellikler kümesi oluşturabilirsiniz.
<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}"/>
Ya da, yapılandırma yoluyla kesinlikle "gün" veya "ay" düzen oluşturucuları gibi şeyler yapabilirsiniz:
<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>
Dosya adınızı tanımlamak için mizanpaj render'larını da kullanabilirsiniz:
<variable name="day" value="${date:format=dddd}"/>
<targets>
<target name="file" xsi:type="File" layout="${verbose}" fileName="${basedir}/${day}.log" />
</targets>
Dosyanızı günlük olarak alırsanız, her dosya "Monday.log", "Tuesday.log" vb. Olarak adlandırılabilir.
Kendi düzen oluşturucunuzu yazmaktan korkmayın. Kolaydır ve konfigürasyon yoluyla günlük dosyasına kendi bağlam bilgilerinizi eklemenizi sağlar. Örneğin, Trace.CorrelationManager.ActivityId öğesini günlüğe ekleyebilen bir düzen oluşturucu (2.0 değil NLog 1.x tabanlı):
[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;
}
}
NLog'a NLog uzantılarınızın (hangi montaj) nerede olduğunu söyleyin:
<extensions>
<add assembly="MyNLogExtensions"/>
</extensions>
Özel düzen oluşturucuyu şu şekilde kullanın:
<variable name="fmt" value="${longdate} | ${ActivityId} | ${message}"/>
Zaman uyumsuz hedefler kullanın:
<nlog>
<targets async="true">
<!-- all targets in this section will automatically be asynchronous -->
</targets>
</nlog>
Ve varsayılan hedef sarmalayıcılar:
<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>
uygun olduğunda. Bunlar hakkında daha fazla bilgi için NLog belgelerine bakın.
NLog'a yapılandırmayı izlemesi ve değişmesi durumunda otomatik olarak yeniden yüklemesini söyleyin:
<nlog autoReload="true" />
NLog sorunlarını gidermeye yardımcı olacak birkaç yapılandırma seçeneği vardır
<nlog throwExceptions="true" />
<nlog internalLogFile="file.txt" />
<nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" />
<nlog internalLogToConsole="false|true" />
<nlog internalLogToConsoleError="false|true" />
Daha fazla bilgi için NLog Yardım'a bakın.
NLog 2.0, bir düzen oluşturucunun çıktısında ek işlem yapılmasına izin veren LayoutRenderer sarmalayıcıları ekler (boşlukları kırpma, büyük harf, küçük harf, vb. Gibi).
Kodunuzu NLog'a büyük bir bağımlılıktan yalıtmak istiyorsanız, kaydediciyi sarmaktan korkmayın, ancak doğru bir şekilde sarın. NLog'un github deposunu nasıl kapatacağınıza dair örnekler var. Kaydırmanın başka bir nedeni de, kaydedilen her iletiye (LogEventInfo.Context içine koyarak) otomatik olarak belirli bağlam bilgileri eklemek istemeniz olabilir.
NLog (veya bu konu için herhangi bir günlük kaydı çerçevesi) kaydırmanın (veya soyutlanmasının) artıları ve eksileri vardır. Biraz çaba ile, burada SO her iki tarafta sunan bol miktarda bilgi bulabilirsiniz.
Kaydırma yapmayı düşünüyorsanız, Common.Logging'i kullanmayı düşünün . Oldukça iyi çalışıyor ve isterseniz başka bir günlük çerçevesine kolayca geçmenizi sağlar. Ayrıca kaydırmayı düşünüyorsanız, bağlam nesnelerini (GDC, MDC, NDC) nasıl ele alacağınızı düşünün. Günlük: Şu anda onlar için bir soyutlamayı desteklememektedir, ancak sözde ekleme yetenekleri kuyruğundadır.