NLog自定义目标详解

介绍

这是一个为NLog定制的目标,它允许跟踪对象的变更。使用这个API,将能够回答以下问题:

  • 谁改变了这个对象?
  • 这个对象何时被改变?
  • 它被改变了什么?(历史列表或特定更改)
  • 在某个时间点对象是怎样的?

使用非常简单,只需将对象传递给NLog,它就会存储自上次以来对该对象所做的任何更改。

强烈建议在开始使用这个自定义目标之前,先使用NLog进行一个小测试。

此代码在NLog版本1.0 Refresh下进行了测试。所有操作都在VS2010上完成,但没有使用任何.NET 4.0的新功能,所以可以在2.0上顺利编译。请从以下网址下载NLog:http://nlog-project.org/download.html。

在开发核心技术模块时,这些模块将作为所有应用程序的起点,认为有一个记录这些应用程序中某些操作的方法会很好。此外,还想知道何时以及谁改变了一个对象。为此,通常会开发一个历史表,它不过是原始表的一个副本,每次对原始表进行更改时,都会在历史表中插入相同的行。这样,就能知道对象的历史……很好!:) 但是……实际上发生了什么变化?如果只改变了一个列或全部列,并不能立即知道。另一个问题是大小……为什么要复制所有列,如果只需要改变一个字段呢?另外,如果向对象添加了一个属性,需要担心更新原始和历史表之间的复制代码。

它是如何工作的?

使用反射,可以枚举对象的属性,并与数据库中已经存储的内容进行匹配。

可能不想自定义对象的每个属性。可以自定义什么被记录吗?

当然!这是一个主要需求。有两种方法可以做到这一点:

  • 将属性应用于对象类和属性。
  • 在目标配置中添加要记录的预期类型及其属性。

它在哪里保存更改?

这个版本只支持SQL Server,尽管它是使用工厂模式开发的,允许开发其他数据库提供程序。

查询数据

如果不能获取日志的历史记录,那么这一切都没有用。

所以现在,可以:

  • 获取修改列表
  • 获取对象的最后一个版本
  • 获取给定日期的对象版本

使用代码

要记录一个Customer类,只需要按照以下步骤操作:

C# // 这里 'customer' 是想要记录的业务对象。 NLog.Logger logger = LogManager.GetCurrentClassLogger(); logger.Trace(customer);

如果想添加谁做了更改,还需要传递一个OHAuditInfo,带有额外的信息:

C# // 这里 'customer' 是想要记录的业务对象。 NLog.Logger logger = LogManager.GetCurrentClassLogger(); logger.Info( string .Empty, customer, new OHAuditInfo() { UserName = " Admin" });

将向这个OHAuditInfo对象添加更多字段。目前,打算添加:

  • ActionType:可以指定更改的类型(插入、更新、删除等)。
  • ExtraInfo:自由文本字段,可以在其中添加任何想要的内容(文本、XML等)。

基本上,上面显示的是一个带有一些虚拟数据的Customer类的实例正在被记录。如所见,只需要将客户传递给NLog

配置

NLog和这个自定义目标不知道类,所以必须指示它们如果收到一个Customer类类型要记录该怎么做。

这种配置可以直接在对象的代码上进行,也可以在目标XML配置上进行。如果一个对象同时定义了两种配置,XML将优先。

在代码中,需要告诉NLog这个类是要被记录的,以及哪些属性是要被记录的。为此,有以下属性:

  • [Log]:将此属性应用于想要记录的类。
  • [LogKey]:每个“可记录”的对象都需要有一个唯一标识它的属性。此属性指定该属性。
  • [LogProperty]:应用于一个属性,将其标记为在记录过程中考虑。只有具有此属性的属性才会保存到记录数据库中。

可以随时添加或删除属性。

ConnectionString(必需):指定要使用的连接字符串。

DbProviderInvariantName(必需):这是目标识别要使用哪个DbClient的方式。像在ADO.NET工厂中一样使用它。

DBTablesPrefix:如果想为表名添加前缀,可以使用这个。这在避免与数据库中现有表的命名冲突以及将所有记录表放在一起时很有用。默认情况下,没有分配任何前缀。

AutoCreateDatabase:如果想不关心数据库是否已经有必要的表,可以使用这个。将此选项设置为true将使目标验证数据库架构,并在必要时更新它。建议将此选项关闭。只有在第一次运行或进行版本更新时才打开。默认情况下,此选项为true。

LogTypes:这是告诉这个NLog目标它应该期待什么类型的地方。在这里配置类型将覆盖直接在类代码中使用[LogKey]和[LogProperty]属性所做的任何配置。在这里配置预期类型必须遵循以下规则:

  • 每种类型配置由|分隔。
  • 每个配置参数由;分隔。
  • 参数定义为:名称:值
  • 属性参数指定要考虑的类型的属性;每个属性名称必须由,分隔。

配置参数名称:类型完全限定名,例如:App.Logger.WebTests.BusinessObjects.Supplier

键:表示对象唯一标识符的属性名称

属性:要记录的属性

这里有一个在演示中使用的NLog.config示例。

XML <? xml version =" 1.0" encoding =" utf-8" ? > < configuration > < nlog xmlns =" http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi =" http://www.w3.org/2001/XMLSchema-instance" > < extensions > < add assembly =" App.Logger" / > < /extensions > < targets > < target name =" OHTarget" type =" OHTarget" connectionString =" Server=.;Database=MyDatabase;UID=sa;PWD=MyP@ssw0rd;" DBTablesPrefix =" " DbProviderInvariantName =" System.Data.SqlClient" AutoCreateDatabase =" True" LogTypes =" name:App.Logger.WebTests.BusinessObjects. Supplier;key:SupplierID;properties:CompanyName,InvoicingAddress,Balance;" / > < /targets > < rules > < logger name =" * " minlevel =" Trace" writeTo =" OHTarget" / > < /rules > < /nlog > < /configuration >

感兴趣的点

这最初是一个测试项目,用于深入了解NLog。在此之后,进行了一些侧向开发,可能会发现它们很有趣:

  • NLog自定义目标创建。
  • 在NLog.Config文件上自定义目标配置。
  • 在应用程序中实现审计,无需太多努力!
  • 使用反射获取可记录属性及其值。
  • 数据库自动更新和脚本版本控制,所以不必担心存储架构的创建或更新。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485