NLog使用


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>
View Code

客戶端調用:

    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;
                }
            }
        }
    }
View Code

 

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>
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM