zoukankan      html  css  js  c++  java
  • NLog

     前言

      NLog是适用于各种.net平台(包括.net standard)的灵活而免费的日志记录平台。通过NLog, 可以轻松地写入多个目标。(数据库、文件、控制台), 并动态更改日志记录配置。
    NLog支持结构化和传统日志记录。NLog的特点: 高性能、易于使用、易于扩展和灵活配置。

    基本配置

      Nuget获取NLog库包:https://www.nuget.org/packages/NLog

    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
          autoReload="true"
          throwExceptions="false"
          internalLogLevel="Info"
          internalLogFile="./logs/nlog-internal.log">

    NLog 根节点以下几种配置需要注意

    • autoReload:配置修改是否自动加载。
    • throwExceptions:日志出现异常时是否需要抛出异常,若配置为true日志记录异常时由于没有捕获异常,会导致程序挂掉。
    • internalLogLevel:表示nlog日志的执行日志记录等级。
    • internalLogFile:表示nlog日志的执行日志记录的位置。通过./XXXX的方式可以配置到程序的相对目录。

    日志等级

      Nlog支持以下几种日志等级

    LevelFirstCharacterOrdinal
    Trace T 0
    Debug D 1
    Info I 2
    Warn W 3
    Error E 4
    Fatal F 5
    Off O 6


      在日志输入时可以通过${level}输入日志等级,或者通过${level:format=FirstCharacter}输出日志等级的简写,查看所有参数输出可以到这里查看。

      在代码中我们不支持Off等级的输出。通过NLog不需要我们认为对日志模块进行启动或关闭,在我们程序关闭后,它会自动关闭日志。相关的Nlog的日志可以在internalLogFile配置的路径中中查看到,同时在生产环境建议将internalLogLevelNLog自己的日志等级设置为Info,这样只会记录关键的日志信息。

    我们输入到文件中,输入配置如下:

    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
                layout="${longdate} ${uppercase:${level}} ${message}" />
    <logger name="*" minlevel="Debug" writeTo="f" />

      具体layout配置:https://nlog-project.org/config/?tab=layout-renderers

    将NLog消息写入Splunk 

     Nuget获取Splunk库包 https://www.nuget.org/packages/NLog.Targets.Splunk

     配置

    <?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">
      <extensions>
        <add assembly="Nlog.Targets.Splunk"/>
      </extensions>
        <target
            name="SplunkLog"
            xsi:type="SplunkHttpEventCollector"
            ServerUrl="http://192.168.100.135:18088"
            Token="8AF31D06-6509-48C5-AAB3-A907FA65FF32"
            Channel="dev-erp-mes"
            RetriesOnError="0"
            IgnoreSslErrors="true"
            layout="${message} ${exception:format=tostring}"
            includeEventProperties="true"/>
      </targets>
      <rules>
        <logger name="*" levels="Info,Error,Warn,Debug,Fatal" writeTo="SplunkLog" />
      </rules>
    </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">
      <extensions>
        <add assembly="Nlog.Targets.Splunk"/>
      </extensions>
    
      <targets async="true">
        <target name="asyncFile" xsi:type="File"
                layout="[${longdate}] [${level}] [${logger}] [${message}] ${newline} ${exception:format=tostring}"
                fileName="${basedir}/log/${shortdate}.txt"
                archiveFileName="${basedir}/log/archives/log.{#####}.txt"
                archiveAboveSize="102400000"
                archiveNumbering="Sequence"
                concurrentWrites="true"
                keepFileOpen="false"
                encoding="utf-8" />
    
        <target
            name="SplunkLog"
            xsi:type="SplunkHttpEventCollector"
            ServerUrl="http://192.168.100.135:18088"
            Token="8AF31D06-6509-48C5-AAB3-A907FA65FF32"
            Channel="dev-erp-mes"
            RetriesOnError="0"
            IgnoreSslErrors="true"
            layout="${message} ${exception:format=tostring}"
            includeEventProperties="true"/>
    
        <target name="console" xsi:type="console"/>
      </targets>
    
      <rules>
        <!--Info,Error,Warn,Debug,Fatal-->
        <logger name="*" levels="Info,Error,Warn,Debug,Fatal" writeTo="asyncFile" />
        <logger name="*" levels="Info,Error,Warn,Debug,Fatal" writeTo="SplunkLog" />
        <logger name="*" minlevel="Error" writeTo="console" />
      </rules>
    </nlog>

    ASP.NET Core 1和2以及Microsoft依赖注入

      Nuget获取NLog.Extensions.Logging库包:https://www.nuget.org/packages/NLog.Extensions.Logging/

    NLog模板

      使用模板的原因:提升性能如果当日志等级不满足的情况下不会去执行字符串的格式处理

      错误代码

    // 当日志等级不满足的情况下也会调用时间ToString()格式化时间
    logger.Fatal($"时间:{DateTime.Now:yyyy-MM-dd hh:mm:ss}", DateTime.Now);

      正确使用如下默认格式 

      查看日志源代码

      public void Fatal<TArgument>([Localizable(false)] string message, TArgument argument)
            { 
                if (IsFatalEnabled)
                {
                    WriteToTargets(LogLevel.Fatal, message, new object[] { argument });
                }
            }

      可以看出只有当IsFatalEnabled值为true才会执行日志模板格式化代码不

      一共有以下4种模板  

          var d = new { A = "xxx", b = "AAA" };

        默认格式

          //默认模板直接Convert.ToString()
          logger.Fatal("默认{name:yyyy-MM-dd hh:mm:ss}fffdweew", DateTime.Now);

          输出:默认2019-08-22 03:07:53fffdweew

        转义符

          //转义符
          logger.Fatal("转义{{name}}dddd", d);

          输出:转义{name}dddd

        引号   

          //加引号
          logger.Fatal("加引号{$name}sss", d);

          输出:加引号"{ A = xxx, b = AAA }"sss

        json序列化

          //序列化
          logger.Fatal("序列化{@name}sdsdsdsd", list);

          输出:序列化{"A":"xxx", "b":"AAA"}sdsdsdsd

      

    
    
    
  • 相关阅读:
    [转]面向接口编程详解(二)——编程实例
    [转]面向接口编程详解(一)——思想基础
    [转] LINQ to SQL快速上手 step by step
    Java备份MySQl数据库,并备份图片数据
    用密码密码拦截
    引用 MySQL集群:主从数据库配置 实现查询负载
    Oracle 对表操作 提示:资源正忙,要求指定nowait
    Jquery一款非好的图片轮换效果
    CodeBlocks集成ObjectiveC开发 Windows下学习ObjectiveC
    查询指定库中所有表
  • 原文地址:https://www.cnblogs.com/liuxiaoji/p/11365042.html
Copyright © 2011-2022 走看看