NLog类库使用探索——详解配置

摘要:
使用configSections<配置>&书信电报;2.1子元件配置。声明目标&lt,声明规则&lt,从不使用)&lt,–include外部配置文件包括外部配置文件<每个路由表条目都是&lt。

https://www.cnblogs.com/fuchongjundream/p/3936431.html

1 配置文件的位置(Configuration file locations)

    通过在启动的时候对一些常用目录的扫描,NLog会尝试使用找到的配置信息进行自动的自我配置。

1.1 单独的*.exe客户端

    单独的客户端,NLog将在以下目录搜索配置信息:

  1. 标准的程序配置文件(通常为 程序名.exe.config
  2. 程序目录下的程序名.exe.nlog文件
  3. 程序目录下的NLog.config文件
  4. NLog.dll所在目录下的NLog.dll.nlog文件 (在Nlog没有导入GAC情况下)

1.2 ASP.NET程序

    在ASP.NET项目中搜索的目录包括:

  1. 标准的web程序配置文件web.config
  2. web.config在同一目录下的web.nlog文件
  3. 程序目录下的NLog.config文件
  4. NLog.dll所在目录下的NLog.dll.nlog文件 (在Nlog没有导入GAC情况下)
  5. 如果定义了NLOG_GLOBAL_CONFIG_FILE环境变量,则该变量所指向的文件

1.2 硬件设备类库(.NET Compact Framework)

    .NET Compact Framework不支持程序配置文件(*.exe.config)和环境变量,因此NLog将只会扫描这些地方:

  1. 程序目录下的NLog.config文件
  2. NLog.dll所在目录下的NLog.dll.nlog文件 (在Nlog没有导入GAC情况下)

1.4 小结

      从上面来看,不管哪个我们把配置文件命名为NLog.config,放在应用程序的目录下,肯定都可以扫描到,哈哈。

2 配置文件的格式(Configuration file format)

   2.1  NLog支持两种配置文件格式

  1. 配置信息嵌入在.NET应用程序标准的*.exe.config或者web.config文件里
  2. 保存在独立文件里

   第一种就是我们熟悉的常规配置,使用configSections

复制代码
<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
  </configSections>
  <nlog>
  </nlog>
</configuration>
复制代码

    如果是第二种,是一个单独的Xml文件的话,需要按如下配置:

<nlog xmlns=http://www.nlog-project.org/schemas/NLog.xsd
      xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance >
</nlog>

    需要说明的是,根节点是<nlong></nlong>,两个命名空间是可选的,但是为了智能感应,你还是把它写上吧。

2.1 子元素的配置

  • <targets /> – defines log targets/outputs ,声明目标
  • <rules /> – defines log routing rules ,声明规则
  • <extensions /> – loads NLog extensions from the *.dll file  加载dll扩展(其实我不懂,没用过)
  • <include /> – includes external configuration file   包含外部配置文件
  • <variable /> – sets the value of a configuration variable 为配置变量赋值

     需要说明的是前两个元素,也就是targets和rules是必需配置的,其余是可选的,应该用于更复杂的配置上,我个人没用过还。

3 输出目标(Targets )

      第一篇文章已经介绍过,应该不用再解释,具体输出到那个目标的详细配置,参见文档:https://github.com/nlog/NLog/wiki/Targets

4 路由规则(Rules)

   <rules />区域定义了日志的路由规则。每一个路由表项就是一个<logger />元素。<logger />有以下属性:

  1. name - 日志源/记录者的名字 (允许使用通配符*)
  2. minlevel - 该规则所匹配日志范围的最低级别
  3. maxlevel - 该规则所匹配日志范围的最高级别
  4. level - 该规则所匹配的单一日志级别
  5. levels - 该规则所匹配的一系列日志级别,由逗号分隔。
  6. writeTo - 规则匹配时日志应该被写入的一系列目标,由逗号分隔。
  7. final - 标记当前规则为最后一个规则。其后的规则即时匹配也不会被运行。

   如:

  1. <logger name="Name.Space.Class1" minlevel="Debug" writeTo="f1" /> - 名字空间Name.Space下的Class1这个类的所有级别等于或者高于Debug的日志信息都写入到“f1”这个目标里。
  2. <logger name="Name.Space.Class1" levels="Debug,Error" writeTo="f1" /> -名字空间Name.Space下的Class1这个类的所有级别等于Debug或Error的日志信息都写入到“f1”这个目标里。
  3. <logger name="Name.Space.*" writeTo="f3,f4" /> -名字空间Name.Space下所有类的所有级别的日志信息都写入到“f3”和“f4”这两个目标里。
  4. <logger name="Name.Space.*" minlevel="Debug" maxlevel="Error" final="true" /> - 名字空间Name.Space下所有类的、级别在Debug和Error之间的(包括Debug,Info,Warn,Error) 日志信息都不会被记录(因为这条规则没有定义writeTo),同时其它后续规则也都会被忽略(因为这里设置了final="true")。
5 上下文布局信息(Layouts and layout renderers)

     NLog最强大的功能之一就是使用布局(layouts)的能力。语法为:“${属性}”为标记所包围的文本所组成。这个标记也就是所谓的“布局生成器(layout renderers),我们可以用它来把一些上下文相关的信息插入到日志信息中。布局可以应用在许多地方,比如可以被用在控制输出到屏幕或写入文件信息的格式,也可以用在控制文件名。

假设我们希望每个输出到控制台的信息都包含一些这些信息:

  • 当前的日期和时间
  • 产生日志信息的类和方法的名字
  • 日志等级
  • 日志内容

利用Layout来实现很简单:,前面已经提到过:

<target name="c" xsi:type="Console"  layout="${longdate} ${callsite} ${level} ${message}"/>

使用Layout控制输出的文件名:

<target name="f" xsi:type="File" fileName="${logger}.txt"/>

使用日期来区分日志文件。如果使用${shortdate}布局生成器:

<target name="f" xsi:type="File" fileName="${shortdate}.txt"/>

更多的布局生成器参考官方文档:

https://github.com/nlog/NLog/wiki/Layout%20Renderers

6 包含配置文件(Include files)

    我们有这样的需求,不想让NLog.cofige文件太大,太多,读起来太累,我们可以把它分割下。如何分割成若干小的config呢?使用include简单完成。

<nlog>
  ...
  <include file="${basedir}/${machinename}.config"/>
  ...
</nlog>

制定了要包含的config小文件位置就行。

7 变量(Variables)

配置文件中也可以定义变量,直接上例子,很明了:

复制代码
//声明语法
<variable name="var" value="xxx" />

<nlog>
  <variable name="logDirectory" value="${basedir}/logs/${shortdate}"/>
  <targets>
    <target name="file1" xsi:type="File" fileName="${logDirectory}/file1.txt"/>
    <target name="file2" xsi:type="File" fileName="${logDirectory}/file2.txt"/>
  </targets>
</nlog>
复制代码
8 自动再配置(Automatic reconfiguration)

    听起来确实挺不好理解的。但是确实也没什么。换句简单的话来说,当我们一旦启动程序,这时候NLog.config文件被读取后,知道程序再启动都不会再读取配置文件了。假如我们不想停掉程序,比如说服务器哪能说停就停哈。这就用上这个配置了,这个配置功能是,一旦你对配置文件修改,程序将会重新读取配置文件,也就是自动再配置。直接上代码:

<nlog autoReload="true">
   ...
</nlog>
9 日志排错(Troubleshooting logging)

       程序没问题了,日志却出了问题。这个该怎么办,到底是哪里不正确了?假如日志本身除了bug该如何解决?这就需要日志排错。把日志的错误信息写入日志。

  • <nlog throwExceptions="true" />    
  • <nlog internalLogFile="file.txt" />- 设置internalLogFile属性可以让NLog把内部的调试和异常信息都写入指定文件里。
  • <nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" /> - 决定内部日志的级别,级别越高,输出的日志信息越简洁。
  • <nlog internalLogToConsole="false|true" /> - 是否把内部日志输出到标准控制台。
  • <nlog internalLogToConsoleError="false|true" /> - 是否把内部日志输出到标准错误控制台 (stderr)。

      设置throwExceptions属性为“true”可以让NLog不再阻挡这类异常,而是把它们抛给调用者。在部署是这样做可以帮我们快速定位问题。一旦应用程序已经正确配置了,我们建议把throwExceptions的值设为“false”,这样由于日志引发的问题不至于导致应用程序的崩溃。

10、异步处理(Asynchronous processing )

       原理也不多说,直接上代码,使其具备异步处理能力。

<nlog>
  <targets async="true">
    <!-- all targets in this section will automatically be asynchronous -->
  </targets>
</nlog>
11 缺省封装(Default  wrappers)

    我们希望用同一种封装来处理所有的目标,比如说增加缓冲和/或自动重试功能。

   NLog为此提供了专门的语法:<default-wrapper />。你只要把这个元素放在<targets />区域里,然后所有的目标都会自动加载同一个封装目标。需要注意的是<default-wrapper />只对当前这个<targets />区域有效,而你可以使用多个<targets />区域,这样你就可以把目标分组并用不同的封装目标处理。

复制代码
<nlog>  
  <targets>  
    <default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>  
    <target name="f1" xsi:type="File" fileName="f1.txt"/>  
    <target name="f2" xsi:type="File" fileName="f2.txt"/>  
  </targets>  
  <targets>  
    <default-wrapper xsi:type="AsyncWrapper">  
      <wrapper-target xsi:type="RetryingWrapper"/>  
    </default-wrapper>  
    <target name="n1" xsi:type="Network" address="tcp://localhost:4001"/>  
    <target name="n2" xsi:type="Network" address="tcp://localhost:4002"/>  
    <target name="n3" xsi:type="Network" address="tcp://localhost:4003"/>  
  </targets>  
</nlog>
复制代码

上面的例子里我们定义了两个缓冲文件目标和三个异步以及自动重试网络目标。

12 缺省目标参数(Default target parameters)

     其实缺省就是把分散的统一在一个区域来定义,仅仅是个语法糖问题,缺省参数自然是把参数相同的抽象出来放到一个区域,统一定义罢了。下面代码是等价的。

复制代码
<nlog> 
  <targets> 
    <target name="f1" xsi:type="File" fileName="f1.txt" keepFileOpen="false"/> 
    <target name="f2" xsi:type="File" fileName="f2.txt" keepFileOpen="false"/> 
    <target name="f3" xsi:type="File" fileName="f3.txt" keepFileOpen="false"/> 
  </targets> 
</nlog>
复制代码
复制代码
<nlog>
  <targets>
    <default-target-parameters xsi:type="File" keepFileOpen="false"/>
    <target name="f1" xsi:type="File" fileName="f1.txt"/>
    <target name="f2" xsi:type="File" fileName="f2.txt"/>
    <target name="f3" xsi:type="File" fileName="f3.txt"/>
  </targets>
</nlog>

复制代码
 
https://nlog-project.org/
https://github.com/adolya/Nlog.RabbitMQ/blob/master/src/Nlog.RabbitMQ.Example/Nlog.config
https://github.com/NLog/NLog/pulls

免责声明:文章转载自《NLog类库使用探索——详解配置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Unity3D入门教程】Unity3D开发实战之五子棋Web项目开发中常见安全问题及防范下篇

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

相关文章

Log4Net使用详解(续)

说明自从上次在2008年在博客上发表过有关log4net的用法介绍文章之后(网址:http://blog.csdn.net/zhoufoxcn/archive/2008/03/26/2220533.aspx),有不少朋友在博文下留言询问一些细节,现在就一些比较普遍的问题做一些稍微深入的解答,希望大家满意。 首先说明一点的是,log4net解决的问题是提供一...

layui中radio的动态加载(进入修改页面时,设置radio)

动态设置   radio  的值让它处于选中状态 效果图 : 前端代码: <div class="layui-form-item"> <label class="layui-form-label">状态</label> <div class="layui-input-block">...

如何控制el-image预览图片的大小

使用el-image标签,发现预览图太大,占满了整个浏览器 代码如下: <el-image :src="scope.row.carouselUrl" :preview-src-list="scope.row.photo"/> 如何才能控制预览图片的大小呢?如果我想不使用image组件又想使用预览大图的功能是否可行呢?我们可以使用image-vi...

App的基本结构

今天主要学习安装了Android Studio,并且成功地在虚拟机上运行了HelloWord工程。下面针对HelloWord工程对app的基本框架结构进行一个总结。掌握app的基本结构对初学软件开发的人是很重要的,搞明白它对于后期开发项目有很大帮助。 以下是HelloWord项目的相关截图:  一个完整的项目分两个子目录,分别是app和Gradle Sc...

Winform(C#.NET)自动更新组件的使用及部分功能实现

声明:核心功能的实现是由园子里圣殿骑士大哥写的,本人是基于他核心代码,按照自己需求进行修改的。      而AutoUpdaterService.xml文件生成工具是基于评论#215楼 ptangbao的代码而改写的。 由于这个组件是在10年写的,.net也有更新有的方法已提示过时,更改如下: //Added the function to support...

js上传

js上传目前有很多的方法,有控件,有自定义的等等 下面为在项目中用到的一个自定义的上传,不依赖任何的控件 ///上传触发事件 function StartLoadCAD() {     var fileupload = document.getElementById('filePro').files;     for (var i = 0; i &l...