NLog的配置文件,文件上面有詳細的備注

<?xml version="1.0" encoding="utf-8" ?> <!-- autoReload:配置文件修改后,程序是否自動加載相關配置 internalLogFile:Nlog程序內部日志的輸出文件 --> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogFile="logs/nlog.log"> <!-- See http://nlog-project.org/wiki/Configuration_file for information on customizing logging rules and outputs. --> <!-- 輸出格式 --> <!-- ErrorLayout變量:錯誤信息的日志布局 --> <variable name="ErrMsg" value="${time} [${level}] - ${message} ${exception:format=ToString} ${stacktrace} "/> <!-- BasicLayout變量:基本的日志布局 --> <variable name="BasicLayout" value="${time} [${level}] - ${message} ${onexception:inner=${ErrMsg}}"/> <!-- ErrorNoticeLayout變量:異常通知的日志布局 --> <variable name="ErrorNoticeLayout" value="##${threadid}##${exception}##${message}##${exception:format=StackTrace}"/> <targets> <!-- DefaultLog目標:通用默認的輸出目標,采用AsyncWrapper、RetryingWrapper,輸出類型為File, 文件最大10M,最多100個文件,文件路徑為fileName,按照日期命名,日志布局采用BasicLayout --> <target name="DefaultLog" xsi:type="AsyncWrapper"> <target xsi:type="RetryingWrapper"> <target xsi:type="File" archiveAboveSize="10240000" maxArchiveFiles="100" fileName="${basedir}/logs/${date:format=yyyyMM}/${shortdate}.log" layout="${BasicLayout}" /> </target> </target> <!-- ErrorLog目標:通用默認的輸出目標,采用AsyncWrapper、RetryingWrapper,輸出類型為File, 文件最大10M,文件路徑為fileName,日志布局采用ErrorLayout--> <target name="ErrorLog" xsi:type="AsyncWrapper"> <target xsi:type="RetryingWrapper"> <target xsi:type="File" archiveAboveSize="10240000" fileName="${basedir}/logs/${date:format=yyyyMM}/${shortdate}_Error.log" layout="${ErrMsg}" /> </target> </target> <!-- ErrorNoticeLog目標:通用默認的輸出目標,采用AsyncWrapper,輸出類型為LogReceiverService, 輸出路徑為endpointAddress,日志布局采用ErrorNoticeLayout--> <target name="ErrorNoticeLog" xsi:type="AsyncWrapper"> <target xsi:type="LogReceiverService" endpointAddress="http://localhost:7169/NLogReceiveWCFService.svc" > <parameter layout="${ErrorNoticeLayout}" name="Layout" type="System.Type"/> </target> </target> </targets> <rules> <!-- 接收所有的Error及更高級的日志,記錄到ErrorLog target --> <logger name="*" minlevel="Error" writeTo="ErrorLog" /> <!-- 接收所有的Error及更高級的日志,記錄到ErrorNoticeLog target --> <!--<logger name="*" minlevel="Error" writeTo="ErrorNoticeLog" />--> <!-- 接收所有的Debug及更高級的日志,記錄到DefaultLog target,在新版本的LogWriter中,需要將name配置為* --> <logger name="DefaultLog" minlevel="Debug" writeTo="DefaultLog" /> </rules> </nlog>
客戶端調用:
class Program { private static Logger logger = LogManager.GetLogger("DefaultLog"); static void Main(string[] args) { logger.Info("Info"); logger.Error("Error"); //logger.Error("測試"); } }
關於target 類型為ErrorNoticeLog的調用服務的方式,需要寫一個WCF服務,繼承NLog中的ILogReceiverServer這個接口,實現ProcessLogMessages這個方法
代碼如下:

public class NLogReceiveWCFService : INLogReceiveWCFService { public void ProcessLogMessages(NLog.LogReceiverService.NLogEvents nevents) { if (nevents == null || nevents.Events == null) return; var events = nevents.ToEventInfo(); foreach (var eachEvent in events) { var logger = LogManager.GetLogger(eachEvent.LoggerName); //業務系統名稱##${threadid}##${message}##${onexception:inner=${ErrMsg}} logger.Log(eachEvent); var p = new LogReportModel(); try { //提供方法執行的上下文環境 OperationContext context = OperationContext.Current; //獲取傳進的消息屬性 var properties = context.IncomingMessageProperties; //獲取消息發送的遠程終結點IP和端口 var endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; p.ID = Guid.NewGuid(); p.IP = endpoint.Address; p.LoggerName = eachEvent.LoggerName; p.Level = eachEvent.Level.ToString(); p.Message = eachEvent.Message; p.LogTime = DateTime.Now; var layout = Regex.Split(eachEvent.Properties["Layout"].ToString(), "##", RegexOptions.IgnoreCase); p.BusinessName = layout[0]; p.Thread = layout[1]; p.ErrorMessage = layout[2]; p.StackTrace = layout[3]; } catch (Exception) { throw; } try { //對報錯信息進行處理,存入數據庫或者發送短信或者發送郵件 } catch (Exception) { throw; } } } }
NLog配置文件,詳細的配置,如下:

<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogFile="${basedir}/logs/nlog.log"> <!-- See http://nlog-project.org/wiki/Configuration_file for information on customizing logging rules and outputs. --> <!-- 輸出格式 --> <variable name="ExceptionMsg" value="${exception:format=type,message,method:maxInnerExceptionLevel=5:innerFormat=shortType,message,method}" /> <variable name="ErrMsg" value="${time} [${threadid}] [${level}] - ${message} ${ExceptionMsg}" /> <variable name="BasicLayout" value="${time} [${threadid}] [${level}] - ${message} ${onexception:inner=${ExceptionMsg}}" /> <variable name="ReportLayout" value="基礎類庫單元測試##${threadid}##${exception}##${message}##${onexception:inner=${ExceptionMsg}}" /> <targets> <target name="DefaultLog" xsi:type="AsyncWrapper"> <target xsi:type="RetryingWrapper"> <target xsi:type="File" archiveAboveSize="10240000" fileName="${basedir}/logs/${date:format=yyyyMM}/${shortdate}.log" layout="${BasicLayout}" /> </target> </target> <target name="ErrorLog" xsi:type="AsyncWrapper"> <target xsi:type="RetryingWrapper"> <target xsi:type="File" archiveAboveSize="10240000" fileName="${basedir}/logs/${date:format=yyyyMM}/${shortdate}_Error.log" layout="${ErrMsg}" /> </target> </target> <target name="ErrorReport" xsi:type="AsyncWrapper"> <target xsi:type="LogReceiverService" endpointAddress="http://192.168.111.204:9440/NLogReceiveWCFService.svc" clientId="Layout"> <parameter layout="${ReportLayout}" name="Layout" type="System.Type" /> </target> </target> </targets> <rules> <logger name="*" minlevel="Error" writeTo="ErrorLog" /> <!--<logger name="*" minlevel="Error" writeTo="ErrorReport" />--> <logger name="*" minlevel="Trace" writeTo="DefaultLog" /> </rules> </nlog>