Nlog 日志框架使用介绍

摘要:
NLog基于NET平台,我们可以使用NLog在应用程序中添加极其完美的跟踪和调试代码。NLog是一个简单而灵活的NET日志类库——设置一个Debug路由,最后指向一个名为f--˃的目标。快速使用1.创建一个Nlog实例privatestaticcreationonnlyNlog。LoggerLogger=NLog。日志管理器。GetCurrentClassLogger();2.使用Debug输出在Config中,我们添加了Debug的最终输出目标,因此我们尝试输出Debug的内容:classProgram{privatestaticreadonlyNLog.LogerLogger=NLog.LogManager.GetCurrentClassLogger();staticvoidMain{Logger.Debug(“我出了意外!

NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。
NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中。

如果嫌弃字多懒得看, 点击跳转视频地址

快速安装

在软件包管理器控制台中使用GUI或以下命令:
1.安装Nlog

Install-Package Nlog

2.安装Nlog.Config

Install-Package Nlog.Config

快速配置

打开目录中得Nlog.Config文件, 可以注意到, XML文件中有详细说明, rules区允许添加用户自定义得路由规则, targets则用于配置一些输出目标, 如下:

<?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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:	emp
log-internal.log">

  <!-- optional, add some variables
  https://github.com/nlog/NLog/wiki/Configuration-file#variables
  -->
  <variable name="myvar" value="myvalue"/>

  <!--
  See https://github.com/nlog/nlog/wiki/Configuration-file
  for information on customizing logging rules and outputs.
   -->
  <targets>

    <!--
    add your targets here
    See https://github.com/nlog/NLog/wiki/Targets for possible targets.
    See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
    -->

    <!--
    Write events to a file with the date in the filename.
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->
  </targets>

  <rules>
    <!-- add your logging rules here -->

    <!--
    Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
    <logger name="*" minlevel="Debug" writeTo="f" />
    -->
  </rules>
</nlog>

我们暂时把注释的说明代码移除, 还原到最简洁得XML格式, 如下:

<?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" >
  <targets>
    <!--这个目标:最终输出文件类型, 位于根目录中得logs文件夹中, 名称以每日得时间一次生成log文件 , layout: 这个选项为生成的格式-->
    <target xsi:type="File" name="f" 
            fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
  </targets>

  <rules>
    <!--设定了一个Debug得路由, 最终指向了一个f名称得目标 -->
    <logger name="*" minlevel="Debug" writeTo="f" />
  </rules>
</nlog>

快速使用

1.创建Nlog实例

private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();

2.使用Debug进行输出
由于在Nlog.Config当中, 我们已经添加了Debug的最终输出目标, 所以我们尝试输出Debug的内容:

 class Program
    {
        private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            Logger.Debug("我出现了意外!");

            Console.ReadKey();
        }
    }

运行完成之后,可以在当前的输出目录中, 发生已经生成了一个logs的文件夹,并且生成了当前计算器日期的log文件 (这个规则在Nolog.Config当中可以进行配置), 如图所示:
Nlog 日志框架使用介绍第1张

详解配置

关于rules中, 我们可以添加多种路由规则, 并且指向多个目标, 如下所示:
Nlog 日志框架使用介绍第2张

添加支持Console输出

1.在rules中添加Info, writeTo指向一个Console的目标

<targets>
    <!--<target xsi:type="File" name="f" 
            fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />-->
    <target xsi:type="Console" name="console"/>
  </targets>

  <rules>
    <!--<logger name="*" minlevel="Debug" writeTo="f" />-->
    <logger name="*" minlevel="Info" writeTo="console"/>
  </rules>

2.使用Info输出
Nlog 日志框架使用介绍第3张

输出至CSV文件

1.在rules中添加一个新的路由, 以支持csv文件, 并且添加一个目标, 输出至csv文件, column可以用于指定每列生成的数据内容格式

    <targets>
        <target name="csv" xsi:type="File" fileName="${basedir}/file.csv">
            <layout xsi:type="CSVLayout">
                <column name="time" layout="${longdate}" />
                <column name="message" layout="${message}" />
                <column name="logger" layout="${logger}"/>
                <column name="level" layout="${level}"/>
            </layout>
        </target>
    </targets>
 
    <rules>
        <logger name="*" minlevel="Debug" writeTo="csv" />
    </rules>

最终调用Debug("xxxx"), 输出的效果如下:
Nlog 日志框架使用介绍第4张

配置日志大小

Nlog允许用户配置单个文件大小, 放置在内容过长效率过慢,配置了大小之后, Nlog会自动创建一个新的文件副本,插入新的日志输出。

  1. maxArchiveFiles: 允许生成的副本文件最大数量
  2. archiveAboveSize: 允许单个文件得最大容量
  3. archiveEvery: 按天生成
  4. layout: 当前得内容布局格式
  5. fileName: 包含完整得生成文件得路径喝文件名
<targets>
    <target name="file" xsi:type="File"
        layout="${longdate} ${logger} ${message}${exception:format=ToString}"
        fileName="${basedir}/logs/logfile.txt"
        maxArchiveFiles="5"
        archiveAboveSize="10240"
        archiveEvery="Day" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="file" />
  </rules>

配置日志分级

单个文件目标可用于一次写入多个文件。以下配置将导致每个日志级别的日志条目被写入一个单独的文件,支持以下格式:
Trace.log
Debug.log
Info.log
Warn.log
Error.log
Fatal.log
只需要在Nlog.Config中配置以下内容即可:

<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
    <targets>
        <target name="file" xsi:type="File"
            layout="${longdate} ${logger} ${message}${exception:format=ToString}" 
            fileName="${basedir}/${level}.log" />
    </targets>
 
    <rules>
        <logger name="*" minlevel="Debug" writeTo="file" />
    </rules>
</nlog>

配置生成规则

只需要将filename中编写得固定名称修改程 ${shortdate} 即可

<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
    <targets>
        <target name="file" xsi:type="File"
            layout="${longdate} ${logger} ${message}${exception:format=ToString}" 
            fileName="${basedir}/${shortdate}.log" />
    </targets>
 
    <rules>
        <logger name="*" minlevel="Debug" writeTo="file" />
    </rules>
</nlog>

日志过滤器

可以在路由当中, 为每个路由配置自定义得日志过滤器fliter, 如下所示, 演示了使用各种表达式来配置过滤器:

<rules>
    <logger name="*" writeTo="file">
        <filters>
            <when condition="length('${message}') > 100" action="Ignore" />
            <when condition="equals('${logger}','MyApps.SomeClass')" action="Ignore" />
            <when condition="(level >= LogLevel.Debug and contains('${message}','PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" />
            <when condition="not starts-with('${message}','PleaseLogThis')" action="Ignore" />
        </filters>
    </logger>
</rules>

条件语言

过滤器表达式以特殊的迷你语言编写。该语言包括:
关系运算符:==,!=,<,<=,>=和>
注意:一些预先定义的XML字符可能需要转义。例如,如果尝试使用'<'字符,则XML解析器会将其解释为开始标记,这会导致配置文件中的错误。而是<在这种情况下使用转义版本的<<(())。
布尔运算符:and,or,not
始终被视为布局的字符串文字- ${somerenderer}
布尔文字- true和false
数值文字-例如12345(整数文字)和12345.678(浮点文字)
日志级别文字- LogLevel.Trace,LogLevel.Debug,...LogLevel.Fatal
预定义的关键字来访问最常用的日志事件属性- level,message和logger
花括号-一起覆盖默认优先级和分组表达式
条件函数-执行string和object测试
单引号应与另一个单引号转义。

条件函数

以下条件功能可用:
contains(s1,s2)确定第二个字符串是否是第一个的子字符串。返回:true当第二个字符串是第一个字符串的子字符串时,false否则返回。
ends-with(s1,s2)确定第二个字符串是否是第一个字符串的后缀。返回:true当第二个字符串是第一个字符串的前缀时,false否则返回。
equals(o1,o2)比较两个对象是否相等。返回:true当两个对象相等时,false否则返回。
length(s) 返回字符串的长度。
starts-with(s1,s2)确定第二个字符串是否是第一个字符串的前缀。返回:true当第二个字符串是第一个字符串的前缀时,false否则返回。
regex-matches(input, pattern, options)在NLog 4.5中引入。指示正则表达式是否pattern在指定的input字符串中找到匹配项。options是一个可选的逗号分隔的RegexOptions枚举值列表。
返回:true当在输入字符串中找到匹配项时,false否则返回。
范例:regex-matches('${message}', '^foo$', 'ignorecase,singleline')

关于更多内容

访问: https://github.com/NLog/NLog , 查看更多内容

免责声明:文章转载自《Nlog 日志框架使用介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇redis设计与实现(一)简单动态字符串requests.exceptions.SSLError: HTTPSConnectionPool(host='cn.bing.com', port=443)报错解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

.NET Core项目部署时自定义端口号

我会在有时间的时候总结Linux系统的部署。NETCore项目只使用这种方法。5.IIS部署项目。指定端口号环境:Windows。NET开发人员应该熟悉IIS吗。当我们使用IIS部署Core项目时,它与之前的Framework项目的部署类似。您可以自定义端口号。...

前端er们如何最快开发h5移动端页面?

因此,它总结了移动终端H5最快发展的最佳方案。web移动终端的发展应注重简化,以满足基本业务需求,设计应尽可能扁平化。前视图层angularjs或react作为框架,node作为中间层,js处理从后端接口获取的数据并操作渲染模板文件,这相当于在MVC中完成控制器层的工作。底层是数据库和后端。...

Qt 调用本地浏览器打开URL

单击一些Qt控件以查找本地浏览器传递的URL以打开前端。...

【转】MUD教程--巫师入门教程4

在MUD中,为了解决定时触发某种现象,一般有两种方法,一种是通过call_out()延时呼叫,另一种就是通过心跳。于是,对于要跨起离线前后的象做牢这类的事,大多都是采用condition。附:由于大多数MUD里的心跳是每两秒调一次,5+random是5至14次,因此可以看出每一个condition被调用的时间是平均19秒。然后它会按照condition的名字...

更改nexus的工作目录

默认情况下,nexus的工作目录位于${user_home}/sonatype工作目录中。在Linux中,如果用户是root用户,则使用/root/sonatype。这便于通过war将nexus安装到servlet容器中,但不利于服务器的集中管理。这需要更改默认的nexus工作目录位置。为了方便管理,您可以选择使用环境变量。...

转:(WIN)S04-CH01 PCIE XDMA开发环境搭建以及环路测试

XDMAIP使用部分教程分LINUX篇和WINDOWS篇两个部分。通过实战,面向应用,提供给大家XILINXFPGAPCIE应用解决方案。本教程以MK7160FA作为样机测试。这是一款高性价比的FPGA开发板。而M_AXI_LITE挂载的BRAM是需要进行BAR空间操作,所以地址设置为0x80000000...