老程序员分享:NLog类库使用探索——详解配置

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 老程序员分享:NLog类库使用探索——详解配置

2 进入正题


2.1 定义


官方定义:NLog is a free logging platform for .NET, Silverlight and Windows Phone with rich log routing and management capabilities. It makes it easy to produce and manage high-quality logs for your application regardless of its size or complexity. 简单的来说NLog就是一个开源的日志管理平台,支持.net,Silverlight,Windows Phone。有着丰富的路由和管理功能。能够很容易的生成和管理你的项目日志。


NLog is an open source project hosted on GitHub and source code is available under the terms of BSD license. //在GitHub可以下到源码,源码是基于BSD License的


Binary packages are available via NuGet. //可以通过NuGet将类库直接导入到项目中去


验的“新生”来说。苦逼的是


2.2 NLog的特性


简单的来说NLog能够导出基于.NET语言的(C#,VB)所有的诊断信息。通过数据上下文(contextual information,包含了发生时间,线程,进程,严重程度等)来格式化你想要导出的信息,打出到哪里呢?Nlog提供了导出目标(targets 文本、数据库、Email、控制台等)


2.3 配置实用


very easy to configure, both through configuration file and programmatically。官方文档中这句算是最重要的了,通过它展示了如何应用到自己的项目中去。提供了两种方式:配置文件和后台编程都可以。


Files - single file or multiple, with automatic file naming and archival


Event Log - local or remote


Database - store your logs in databases supported by .NET


Network - using TCP, UDP, SOAP, MSMQ protocols


Command-line console - including color coding of messages


E-mail - you can receive emails whenever application errors occur


以上相关链接,给出了向文件,远程日志,数据库,邮箱等为目标的日志输出相关例子,用时查阅即可。下面结合项目实例,简单了解下最简单的使用过程。


3、项目实例


3.1 输出目标为控制台的小例子


第一步:通过NetGet导入类库dll。


第二步:打开配置文件NLog.config


第三步:定义导出目标和输出哪些信息


添加目标,并指定输出的布局,也就是说我们想把项目日志输出到哪里,输出的格式是什么?


layout是固定格式,${}是语法格式,这里分别输出的信息分别为:时间,级别,信息


第四步:定义输出规则


我们到底要输出哪些信息到日志文件中去,这就涉及到了记录等级的问题。


记录等级(log level)信息,用来描述该条信息的重要性。NLog支持如下几种记录等级:


Trace - 最常见的记录信息,一般用于普通输出


Debug - 同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序


Info - 信息类型的消息


Warn - 警告信息,一般用于比较重要的场合


Error - 错误信息


Fatal - 致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。


这个小例子,我们把输出等级设为等级等于或高于Debug等级的信息输出至控制台


这句话很明了但需要说明的是write to属性应该是target的名字。意思是写到输出目标里面。


第五步:创建logger对像,若希望生成并输出诊断信息,我们还需要添加一个Logger对象。Logger对象的方法名和记录等级的名称一样(Debug()、Info()、Fatal()……)。Logger对象是通过LogManager对象创建的。建议Logger对象的名称和程序的类名保持一致。调用LogManager的GetCurrentClassLogger()方法即可自动为当前类创建一个Logger对象。后台代码如下:


using NLog;


namespace WpfApplication4


{


///


/// MainWindow.xaml 的交互逻辑


///


public partial class MainWindow : Window


{


public static Logger mainwindowLogger = LogManager.GetCurrentClassLogger();//该Logger对象代表与当前类相关联的日志消息的来源。


public MainWindow()


{


InitializeComponent();


mainwindowLogger.Debug("模拟一条Debug级别的信息");//发出一条Debug记录等级的诊断信息。


}


}


}


通过以上几步,应该基本了解了Nlog的工作流程。配置文件中配置输出目标,要输出哪些诊断信息(layout),并定义输出规则,什么等级的信息输出。应用程序后台代码中使用logger对象定义输出的诊断信息。


3.2 进一步的扩展这个例子


我们新增加一个需求,如果同时输出到一个文件呢?该如何做?这也不难,需要修改配置文件就行。添加一个target即可。


两幅图已经很说明问题,不再详细描述。


4、小结


零零散散写了个简单的例子,只供像我这种入门级别的人看看罢了,下一篇,继续深入探讨NLog。


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


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


1.1 单独的.exe客户端


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


标准的程序配置文件(通常为 程序名.exe.config)


程序目录下的程序名.exe.nlog文件


程序目录下的NLog.config文件


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


1.2 ASP.NET程序


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


标准的web程序配置文件web.config


和web.config在同一目录下的web.nlog文件


程序目录下的NLog.config文件


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


如果定义了NLOG_GLOBAL_CONFIG_FILE环境变量,则该变量所指向的文件


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


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


程序目录下的NLog.config文件


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


1.4 小结


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


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


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


配置信息嵌入在.NET应用程序标准的.exe.config或者web.config文件里


保存在独立文件里


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


[span style="color: rgba(128, 0, 0, 1)">configuration

[span style="color: rgba(128, 0, 0, 1)">configSections

[span style="color: rgba(128, 0, 0, 1)">section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>



[span style="color: rgba(128, 0, 0, 1)">nlog



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


[span style="color: rgba(128, 0, 0, 1)">nlog xmlns=


xmlns:xsi=


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


2.1 子元素的配置


– defines log targets/outputs ,声明目标


– defines log routing rules ,声明规则


– loads NLog extensions from the .dll file 加载dll扩展(其实我不懂,没用过)


– includes external configuration file 包含外部配置文件


– sets the value of a configuration variable 为配置变量赋值


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


3 输出目标(Targets )


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


4 路由规则(Rules)


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


name - 日志源/记录者的名字 (允许使用通配符*)


minlevel - 该规则所匹配日志范围的最低级别


maxlevel - 该规则所匹配日志范围的最高级别


level - 该规则所匹配的单一日志级别


levels - 该规则所匹配的一系列日志级别,由逗号分隔。


writeTo - 规则匹配时日志应该被写入的一系列目标,由逗号分隔。


final - 标记当前规则为最后一个规则。其后的规则即时匹配也不会被运行。


如:


- 名字空间Name.Space下的Class1这个类的所有级别等于或者高于Debug的日志信息都写入到“f1”这个目标里。


-名字空间Name.Space下的Class1这个类的所有级别等于Debug或Error的日志信息都写入到“f1”这个目标里。


-名字空间Name.Space下所有类的所有级别的日志信息都写入到“f3”和“f4”这两个目标里。


- 名字空间Name.Space下所有类的、级别在Debug和Error之间的(包括Debug,Info,Warn,Error) 日志信息都不会被记录(因为这条规则没有定义writeTo),同时其它后续规则也都会被忽略(因为这里设置了final="true")。


5 上下文布局信息(Layouts and layout renderers)


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


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


当前的日期和时间


产生日志信息的类和方法的名字


日志等级


日志内容


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


[span style="color: rgba(128, 0, 0, 1)">target name="c" xsi:type="Console" layout="${longdate} ${callsite} ${level} ${message}"/>


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


[span style="color: rgba(128, 0, 0, 1)">target name="f" xsi:type="File" fileName="${logger}.txt"/>


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


[span style="color: rgba(128, 0, 0, 1)">target name="f" xsi:type="File" fileName="${shortdate}.txt"/>


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


6 包含配置文件(Include files)


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


[span style="color: rgba(128, 0, 0, 1)">nlog

...


[span style="color: rgba(128, 0, 0, 1)">include file="${basedir}/${machinename}.config"/>


...



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


7 变量(Variables)


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


//声明语法


[span style="color: rgba(128, 0, 0, 1)">variable name="var" value="xxx" />


[span style="color: rgba(128, 0, 0, 1)">nlog

[span style="color: rgba(128, 0, 0, 1)">variable name="logDirectory" value="${basedir}/logs/${shortdate}"/>


[span style="color: rgba(128, 0, 0, 1)">targets

[span style="color: rgba(128, 0, 0, 1)">target name="file1" xsi:type="File" fileName="${logDirectory}/file1.txt"/>


[span style="color: rgba(128, 0, 0, 1)">target name="file2" xsi:type="File" fileName="${logDirectory}/file2.txt"/>




8 自动再配置(Automatic reconfiguration)


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


[span style="color: rgba(128, 0, 0, 1)">nlog autoReload="true"

...



9 日志排错(Troubleshooting logging)


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


- 设置internalLogFile属性可以让NLog把内部的调试和异常信息都写入指定文件里。


- 决定内部日志的级别,级别越高,输出的日志信息越简洁。


- 是否把内部日志输出到标准控制台。


- 是否把内部日志输出到标准错误控制台 (stderr)。


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


10、异步处理(Asynchronous processing )


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


[span style="color: rgba(128, 0, 0, 1)">nlog

[span style="color: rgba(128, 0, 0, 1)">targets async="true"




11 缺省封装(Default wrappers)


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


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


[span style="color: rgba(128, 0, 0, 1)">nlog

[span style="color: rgba(128, 0, 0, 1)">targets

[span style="color: rgba(128, 0, 0, 1)">default-wrapper xsi:type="BufferingWrapper" bufferSize="100"/>


[span style="color: rgba(128, 0, 0, 1)">target name="f1" xsi:type="File" fileName="f1.txt"/>


[span style="color: rgba(128, 0, 0, 1)">target name="f2" xsi:type="File" fileName="f2//代码效果参考:http://hnjlyzjd.com/xl/wz_24015.html

.txt"/>


[span style="color: rgba(128, 0, 0, 1)">targets

[span style="color: rgba(128, 0, 0, 1)">default-wrapper xsi:type="AsyncWrapper"

[span style="color: rgba(128, 0, 0, 1)">wrapper-target xsi:type="RetryingWrapper"/>



[span style="color: rgba(128, 0, 0, 1)">target name="n1" xsi:type="Network" address=""/>


[span style="color: rgba(128, 0, 0, 1)">target name="n2" xsi:type="Network" //代码效果参考:http://hnjlyzjd.com/hw/wz_24013.html

address=""<span style="color: rgba(0, 0,
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
SQL 存储 Java
令应用开发效率飙升的 Java 类库
更多地使用 Java 而避免存储过程和复杂 SQL 是当前应用开发的一个潮流,这会在架构上带来优势,但用 Java 实现 SQL 式的运算并不是非常方便,很多任务要从头写起,开发效率其实反而会降低。
|
1月前
|
开发框架 前端开发 小程序
分享47个PHP框架源码,总有一款适合您
分享47个PHP框架源码,总有一款适合您
89 0
|
8月前
|
域名解析 网络协议 Oracle
Java的第十五篇文章——网络编程(后期再学一遍)
Java的第十五篇文章——网络编程(后期再学一遍)
|
9月前
|
存储 算法 搜索推荐
从零开始学习 Java:简单易懂的入门指南之查找算法及排序算法(二十)
从零开始学习 Java:简单易懂的入门指南之查找算法及排序算法(二十)
|
10月前
|
开发框架 自然语言处理 Java
妈!Jetpack Compose太难学了,别怕,这里帮你理清几个概念(一)
妈!Jetpack Compose太难学了,别怕,这里帮你理清几个概念
270 0
|
10月前
|
API Android开发
妈!Jetpack Compose太难学了,别怕,这里帮你理清几个概念(二)
妈!Jetpack Compose太难学了,别怕,这里帮你理清几个概念
283 0
|
算法 Python
以为是高性能神仙算法,一看源代码才发现...
以为是高性能神仙算法,一看源代码才发现...
85 0
|
缓存 安全 Java
别再重复造轮子了,推荐使用 Google Guava 开源工具类库,真心强大!
别再重复造轮子了,推荐使用 Google Guava 开源工具类库,真心强大!
296 0
别再重复造轮子了,推荐使用 Google Guava 开源工具类库,真心强大!
|
人工智能 算法 搜索推荐
算法很美,听我讲完这些Java经典算法包你爱上她
大家好,我是小羽。对于编程来说的话,只有掌握了算法才是了解了编程的灵魂,算法对于新手来说的话,属实有点难度,但是以后想有更好的发展,得到更好的进阶的话,对算法进行系统的学习是重中之重的。对...
404 0
算法很美,听我讲完这些Java经典算法包你爱上她
|
JavaScript 前端开发 Java
不要再重复造轮子了,Hutool这款开源工具类库贼好使(2)
不要再重复造轮子了,Hutool这款开源工具类库贼好使
737 0
不要再重复造轮子了,Hutool这款开源工具类库贼好使(2)