NLog使用

NLog的配置文件,文件上面有详细的备注,注意这个配置文件一定要放在NLog.dll的文件夹里

复制代码
<?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>
复制代码
posted on 2017-06-22 19:45  NLazyo  阅读(240)  评论(0编辑  收藏  举报