• 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>
    复制代码
  • 相关阅读:
    手把手教你接入微信支付
    Java中的深浅拷贝问题,你清楚吗?
    DeimosC2 源码阅读
    一行命令删除空的docker images
    docker build出现交互式时区设置解决
    Amass项目源码阅读(整体架构)
    Prometheus时序数据库-磁盘中的存储结构
    Prometheus时序数据库-内存中的存储结构
    解Bug之路-ZooKeeper集群拒绝服务
    日常Bug排查-Nginx重复请求?
  • 原文地址:https://www.cnblogs.com/bile/p/7066889.html
Copyright © 2020-2023  润新知