Một số trong số này thuộc danh mục các mẹo NLog (hoặc ghi nhật ký) chung thay vì các đề xuất cấu hình nghiêm ngặt.
Dưới đây là một số liên kết đăng nhập chung từ đây tại SO (bạn có thể đã thấy một số hoặc tất cả các liên kết này rồi):
log4net so với Nlog
Ghi nhật ký thực hành tốt nhất
Điểm của một mặt tiền đăng nhập là gì?
Tại sao logger khuyên bạn nên sử dụng logger mỗi lớp?
Sử dụng mẫu phổ biến của việc đặt tên logger của bạn dựa trên lớp Logger logger = LogManager.GetCurrentClassLogger()
. Điều này cung cấp cho bạn mức độ chi tiết cao trong logger của bạn và mang lại cho bạn sự linh hoạt cao trong cấu hình của logger (kiểm soát toàn cầu, theo không gian tên, theo tên logger cụ thể, v.v.).
Sử dụng logger không dựa trên tên lớp khi thích hợp. Có thể bạn có một chức năng mà bạn thực sự muốn kiểm soát việc đăng nhập riêng. Có thể bạn có một số mối quan tâm đăng nhập chéo (ghi nhật ký hiệu suất).
Nếu bạn không sử dụng ghi nhật ký dựa trên tên lớp, hãy xem xét việc đặt tên các logger của bạn theo một loại cấu trúc phân cấp nào đó (có thể theo khu vực chức năng) để bạn có thể duy trì tính linh hoạt cao hơn trong cấu hình của mình. Ví dụ: bạn có thể có một khu vực chức năng "cơ sở dữ liệu", FA "phân tích" và FA "ui". Mỗi trong số này có thể có các khu vực phụ. Vì vậy, bạn có thể yêu cầu logger như thế này:
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");
Và như thế. Với các trình ghi nhật ký phân cấp, bạn có thể định cấu hình ghi nhật ký toàn cầu ("*" hoặc trình ghi nhật ký gốc), bằng FA (Cơ sở dữ liệu, Phân tích, Giao diện người dùng) hoặc bằng phương thức ngầm (Database.Connect, v.v.).
Loggers có nhiều tùy chọn cấu hình:
<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" />
Xem trợ giúp NLog để biết thêm thông tin về chính xác ý nghĩa của từng tùy chọn. Có lẽ các mục đáng chú ý nhất ở đây là khả năng quy tắc logger ký tự đại diện, khái niệm rằng nhiều quy tắc logger có thể "thực thi" cho một câu lệnh ghi nhật ký duy nhất và quy tắc logger có thể được đánh dấu là "cuối cùng" để các quy tắc tiếp theo sẽ không thực thi cho đưa ra tuyên bố đăng nhập.
Sử dụng GlobalDiagnellectContext, MappedDiagnellectContext và NestedDiagnellectContext để thêm bối cảnh bổ sung vào đầu ra của bạn.
Sử dụng "biến" trong tệp cấu hình của bạn để đơn giản hóa. Ví dụ: bạn có thể xác định các biến cho bố cục của mình và sau đó tham chiếu biến trong cấu hình đích thay vì chỉ định bố cục trực tiếp.
<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>
Hoặc, bạn có thể tạo một tập các thuộc tính "tùy chỉnh" để thêm vào bố cục.
<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}"/>
Hoặc, bạn có thể thực hiện các công cụ như tạo trình kết xuất bố cục "ngày" hoặc "tháng" thông qua cấu hình:
<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>
Bạn cũng có thể sử dụng kết xuất bố cục để xác định tên tệp của mình:
<variable name="day" value="${date:format=dddd}"/>
<targets>
<target name="file" xsi:type="File" layout="${verbose}" fileName="${basedir}/${day}.log" />
</targets>
Nếu bạn cuộn tệp của mình hàng ngày, mỗi tệp có thể được đặt tên là "Thứ Hai.log", "Thứ Ba.log", v.v.
Đừng ngại viết trình kết xuất bố cục của riêng bạn. Thật dễ dàng và cho phép bạn thêm thông tin ngữ cảnh của riêng bạn vào tệp nhật ký thông qua cấu hình. Ví dụ: đây là trình kết xuất bố cục (dựa trên NLog 1.x, không phải 2.0) có thể thêm Trace.CorrelationManager.ActivityId vào nhật ký:
[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;
}
}
Nói với NLog nơi tiện ích mở rộng NLog của bạn (lắp ráp gì) như thế này:
<extensions>
<add assembly="MyNLogExtensions"/>
</extensions>
Sử dụng trình kết xuất bố cục tùy chỉnh như thế này:
<variable name="fmt" value="${longdate} | ${ActivityId} | ${message}"/>
Sử dụng các mục tiêu không đồng bộ:
<nlog>
<targets async="true">
<!-- all targets in this section will automatically be asynchronous -->
</targets>
</nlog>
Và các trình bao bọc mục tiêu mặc định:
<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>
nơi thích hợp. Xem tài liệu NLog để biết thêm thông tin về những tài liệu đó.
Yêu cầu NLog xem và tự động tải lại cấu hình nếu thay đổi:
<nlog autoReload="true" />
Có một số tùy chọn cấu hình để giúp khắc phục sự cố NLog
<nlog throwExceptions="true" />
<nlog internalLogFile="file.txt" />
<nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" />
<nlog internalLogToConsole="false|true" />
<nlog internalLogToConsoleError="false|true" />
Xem Trợ giúp NLog để biết thêm.
NLog 2.0 bổ sung các trình bao bọc LayoutRenderer cho phép xử lý bổ sung được thực hiện trên đầu ra của trình kết xuất bố cục (chẳng hạn như cắt xén khoảng trắng, đường trên, đường dưới, v.v.).
Đừng ngại bọc logger nếu bạn muốn cách ly mã của mình khỏi sự phụ thuộc cứng vào NLog, nhưng bọc chính xác. Có những ví dụ về cách bọc trong kho github của NLog. Một lý do khác để gói có thể là bạn muốn tự động thêm thông tin ngữ cảnh cụ thể vào từng thông điệp đã ghi (bằng cách đưa nó vào LogEventInfo.Context).
Có những ưu và nhược điểm để gói (hoặc trừu tượng hóa) NLog (hoặc bất kỳ khung ghi nhật ký nào khác cho vấn đề đó). Với một chút nỗ lực, bạn có thể tìm thấy nhiều thông tin ở đây trên SO trình bày cả hai mặt.
Nếu bạn đang xem xét gói, hãy xem xét sử dụng Common.Logging . Nó hoạt động khá tốt và cho phép bạn dễ dàng chuyển sang một khung đăng nhập khác nếu bạn muốn làm như vậy. Ngoài ra nếu bạn đang xem xét việc gói, hãy nghĩ về cách bạn sẽ xử lý các đối tượng bối cảnh (GDC, MDC, NDC). Common.Logging hiện không hỗ trợ sự trừu tượng hóa cho chúng, nhưng nó được cho là trong hàng đợi các khả năng cần thêm.