`
lovnet
  • 浏览: 6907310 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

扩展Nlog Layout Renderer原理、Demo、 工具下载

阅读更多

我们可以通过修改NLog配置文件来控制日志输出格式,但是有时候我们会有这样的需求:我要把UserID OrderID也记录下来,我们可以像使用${date}${message}一样写${UserID} ${OrderID}么?答案是可以的,只需要写一个扩展。我们讲分析实现原理,给出代码示例,演示一下怎么在程序中应用,并提供一个生成Layout Renderer扩展代码的小工具。

Layout Renderer扩展的原理

作为一个有着良好扩展性的日志组件,我们要实现上述目标也是不必修改NLog源代码的。这很好的符合了面对对象的OCP原则。不过要分析原理还是要从源代码下手,打开“\Log4WF\NLog-1.0\src\NLog\LayoutRenderers”文件夹,这里你可以看到NLog默认的提供的输出标记的实现。

打开一个ThreadID.cs的文件,我们看一下

1usingSystem;
2usingSystem.Text;
3usingSystem.Runtime.InteropServices;
4
5usingNLog.Internal;
6
7namespaceNLog.LayoutRenderers
8{
9/**////<summary>
10///Theidentifierofthecurrentthread.
11///</summary>

12[LayoutRenderer("threadid")]
13publicclassThreadIDLayoutRenderer:LayoutRenderer
14{
15/**////<summary>
16///Returnstheestimatednumberofcharactersthatareneededto
17///holdtherenderedvalueforthespecifiedloggingevent.
18///</summary>
19///<paramname="logEvent">Loggingeventinformation.</param>
20///<returns>Thenumberofcharacters.</returns>
21///<remarks>
22///Iftheexactnumberisnotknownor
23///expensivetocalculatethisfunctionshouldreturnaroughestimate
24///that'sbigenoughinmostcases,butnottoobig,inordertoconservememory.
25///</remarks>

26protectedinternaloverrideintGetEstimatedBufferSize(LogEventInfologEvent)
27{
28return32;
29}

30
31/**////<summary>
32///Rendersthecurrentthreadidentifierandappendsittothespecified<seecref="StringBuilder"/>.
33///</summary>
34///<paramname="builder">The<seecref="StringBuilder"/>toappendtherendereddatato.</param>
35///<paramname="logEvent">Loggingevent.</param>

36protectedinternaloverridevoidAppend(StringBuilderbuilder,LogEventInfologEvent)
37{
38builder.Append(ApplyPadding(ThreadIDHelper.Instance.CurrentThreadID.ToString()));
39}

40}

41}

42

这里重载了两个方法:GetEstimatedBufferSize设置缓冲区大小;Append将要记录的内容追加到日志中。

这也给我们指明了方向,其实我们要做的是两件事情:

1.估计缓冲区大小,这个不难,有些真的是无法估计缓冲区大小的怎么办?打开Message.cs看一下,可以写 logEvent.Message.Length;

2.把要标记所代表的信息追加到日志流中,追加可以很简单的模仿上面的写法,可是到哪里取我们的记录的数据呢?或者说我们要把数据放在哪里可以方便的提取呢?

LogEventInfo这个类代表了要记录的事件信息,除了Message等熟悉之外里面有一个字典类型的Context,可以在这里记录额外的信息。当然了后面我们还要从这里提取出来追加到日志中。看例子,

1这样LayoutRenderer的扩展也就毫无悬念了,比如我们要写的Query的扩展就会是类似下面这个样子:
2usingSystem;
3usingSystem.Collections.Generic;
4usingSystem.Text;
5usingNLog;
6
7namespaceMyTest.NlogLayoutRenderers
8{
9[LayoutRenderer("Query")]//注意这里
10publicclassQueryLayloutRenderer:LayoutRenderer
11{
12protectedoverrideintGetEstimatedBufferSize(LogEventInfologEvent)
13{
14returnlogEvent.Message.Length;//注意这里
15}

16protectedoverridevoidAppend(StringBuilderbuilder,LogEventInfologEvent)
17{
18builder.Append(logEvent.Context["Query"].ToString());//注意这里
19}

20}

21}

22
23

在程序中使用自定义扩展

NLog如何使用这些自定义的标记呢?

NLog在很多场合做同一件事情都会给我们两个选择,可以用配置文件来做,同样也可以用代码来完成同等的操作。

同样这里也是又两种方式可供选择:

  • 如果只是一个简单的扩展,可以考虑使用代码加载: LayoutRendererFactory.AddLayoutRenderer("UserID", typeof(NLogTest.UserIDLayoutRenderer));

完成这样一个预备工作,就可以在后续的代码中使用自定义的UserID标记了。

  • 同样的我们可以把这些自定义的LayoutRenderer的扩展放在一个程序集里面,通过配置NLog的配置文件,可以让NLog在初始化的时候加载这些扩展。这样显然更灵活了。具体配置文件样例如下:
  • <nlog>
    <extensions>
    <addassembly="MyTest"/>
    </extensions>
    <targets>
    <targetname="console"type="Console"
    layout="${Query} ${message}"/>
    </targets>
    <rules>
    <loggername="*"minLevel="Info"appendTo="console"/>
    </rules>
    </nlog>
    这里有一个细节,extensions配置节必须要写在其它配置节的前面,否则会出错。

明白了原理,代码用工具生成吧

程序员也许是最讨厌重复的人群,于是好多人实践重构以消除重复。

写了一些LayoutRenderer的扩展之后,我们会发现代码绝大多数是相似的,变化的点只有变量名和缓冲区的长度。写一个模板,然后简单的字符串替换生成文件就可以了。没有什么技术含量,只是简化复制粘贴的过程。如果NLog的架构能把这件工作给简化了,那才是真正的简化。

工具包含这样两个东西:

11.代码模板,需要替换的字符串是@Name@Size
2usingSystem;
3usingSystem.Collections.Generic;
4usingSystem.Text;
5usingNLog;
6
7namespaceMyTest.NlogLayoutRenderers
8{
9[LayoutRenderer("@Name")]
10publicclass@NameLayloutRenderer:LayoutRenderer
11{
12protectedoverrideintGetEstimatedBufferSize(LogEventInfologEvent)
13{
14return@Size;
15}

16protectedoverridevoidAppend(StringBuilderbuilder,LogEventInfologEvent)
17{
18builder.Append(logEvent.Context["@Name"].ToString());
19}

20}

21}

22

2.字段列表,每一行包含字段名和字段长度,中间使用TAB隔开

User50

Session36

IP15

Login24

Online32

LoginMethodlogEvent.Message.Length

LogoutMethodlogEvent.Message.Length

Library32

使用的时候只要修改这两个文件就可以了,生成的文件在当前目录的Output文件夹中,文件编码UTF-8

下载地址:NLogTool.rar

参考文献: <http://www.nlog-project.org/howto_write_layout_renderer.html>

(本文完)

坚强2002和你一起回头再说...
Tag标签: NLog
分享到:
评论

相关推荐

    NLog v4.7.11最新版Demo

    通过这个Demo,你可以了解如何将NLog v4.7.11集成到你的.NET项目中,并根据项目需求定制日志策略。 总的来说,NLog v4.7.11是一个功能强大且易于使用的日志记录工具,对于任何.NET开发者来说,都是管理和跟踪应用...

    Nlog 日志DEMO

    NLog是一个简单灵活的.NET日志记录类库,NLog的API非常类似于log4net,且配置方式非常简单。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的调试信息,根据项目需求配置署出格式和输出目标的规则。

    NLog demo,文档

    其灵活性和可扩展性使得它成为.NET开发中的首选日志记录工具。 综上所述,NLog是一个功能强大且高度可定制的日志框架,它简化了C#应用程序的日志管理和分析工作。通过合理配置和使用NLog,开发者可以有效地跟踪程序...

    基于Autofac的Nlog扩展

    Autofac.Extras.NLog这个库就是这样一个工具,它扩展了Autofac的功能,使得NLog可以被Autofac容器自动注入到需要日志记录的类中。这样做的好处是,无需在每个类中手动初始化NLog,降低了代码的重复性和复杂性。 要...

    WPF MVVM双向绑定DEMO + NLOG DEMO

    在这个DEMO中,你将学习如何在WPF应用中集成NLog,用于收集、格式化和记录应用程序的日志信息。 配置NLog通常涉及以下几个步骤: 1. 引入NLog库。 2. 创建`nlog.config`文件,定义日志的目标(如控制台、文件、...

    NLog上传DLL

    1. **下载NLog**: 你可以从NuGet包管理器或者NLog官方网站下载NLog的最新版本。NuGet是.NET开发中最常用的包管理工具,通过Visual Studio的管理器可以直接搜索并安装NLog包。 2. **添加引用**: 在Visual Studio中,...

    DotNetCore-Nlog

    9. **诊断和调试**:NLog 还提供了一些工具和特性,如 NLog Viewer、NLog Config Validator,用于检查和调试日志配置。 10. **扩展性**:NLog 设计为高度可扩展,可以通过编写自定义的布局处理器、过滤器、目标等,...

    NLog免安装

    NLog的优势在于其灵活性和扩展性,它支持多种日志目标,包括文件、数据库、电子邮件、Windows事件日志、甚至是网络套接字。同时,NLog提供了丰富的API和强大的过滤机制,使得开发者可以轻松控制日志的生成、存储和...

    .NET 6 使用 Log4Net 和 Nlog日志中间件 Demo

    log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。 log4net是Apache软件基金会Apache Logging Services工程的一部分。Apache...

    NLog123.rar

    Visual Studio 2019是我们的开发环境,NLog作为强大的日志框架,将帮助我们实现灵活且可扩展的日志管理。 首先,我们需要了解什么是NLog。NLog是一个开源的日志记录库,它为.NET应用程序提供了一个高级的、灵活的、...

    NLog作为Microsoft扩展日志记录的日志记录提供程序-C#-PowerShell-下载

    (更多详情、使用方法,请下载后细读README.md文件) 'NLog.Extensions.Logging & NLog.Extensions.Hosting NLog.Extensions.Logging NLog.Extensions.Logging使得将 NLog 与Microsoft ILogger抽象和依赖注入一起使用...

    vs 日志类工具Nlog

    **NLog:强大的.NET日志记录框架** NLog是一款开源的日志记录库,专为.NET开发者设计,旨在简化日志管理并提供灵活的错误跟踪和...NLog的灵活性、可扩展性和强大的配置能力,使其成为了.NET开发中的首选日志工具之一。

    NLog最新版VS2010可用

    总之,NLog是.NET开发中的一个强大工具,无论是在小型项目还是大型企业级应用中,都能提供可靠和灵活的日志管理方案。通过理解和掌握NLog的使用,开发者可以更好地监控和调试自己的应用程序,从而提高开发效率和软件...

    C# Nlog 日志记录 学习

    在IT行业中,日志记录是软件开发不可或缺的一部分,它能够...无论是用于调试、性能分析还是故障排查,NLog都是一个强大而可靠的工具。在实际项目中,理解并熟练运用NLog的配置和API,将有助于提升开发效率和软件质量。

    利用Nlog记录日志到数据库

    1. 安装NLog和NLog.Database扩展:通过NuGet包管理器安装NLog和NLog.Database,这两个包分别提供了基础的日志功能和数据库日志目标。 2. 配置NLog.config:创建一个名为NLog.config的XML配置文件,这是NLog读取配置...

    C#使用NLog记录日志的案例程序

    3、可以通过这个Demo做基础,或兼容或开发,进行C#的程序开发,可以直接使用NLog的日志功能 二、使用NLog的好处 1、NLog日志配置灵活:NLog允许开发者通过配置文件(通常是NLog.config)来设定日志记录的行为,如...

    NLog记录日志、发邮件、写入数据库

    总结,NLog为.NET开发者提供了全面的日志管理和分析工具。通过灵活配置,我们可以方便地实现日志的文件记录、邮件通知和数据库存储,从而提高应用的可维护性和问题排查效率。在实际项目中,结合使用这些功能,可以...

    Nlog的使用测试

    本文将详细介绍NLog的使用方法以及如何配置文件,帮助你更好地理解和应用这一工具。 首先,让我们了解NLog的基本概念。NLog提供了一个简单的方式来记录应用程序中的事件,如错误、警告和信息,这些事件可以被写入到...

    全局异常捕获&NLOG使用配置示例

    NLog是一个强大的、可扩展的日志记录库,适用于.NET Framework和.NET Core。配置NLog通常涉及创建一个nlog.config文件,其中定义了目标(如控制台、文件、数据库等)和规则来确定如何路由和格式化日志消息。 以下是...

    日志,NLog日志扩展,大批量日志插入操作源代码

    本主题将深入探讨如何使用NLog进行日志扩展,特别是关于大批量日志插入操作的源代码实现。 首先,NLog的扩展通常涉及到自定义日志目标和布局渲染器。在大批量日志处理的场景下,传统的单条写入可能会对性能造成影响...

Global site tag (gtag.js) - Google Analytics