这是一个为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对象添加更多字段。目前,打算添加:
基本上,上面显示的是一个带有一些虚拟数据的Customer类的实例正在被记录。如所见,只需要将客户传递给NLog。
NLog和这个自定义目标不知道类,所以必须指示它们如果收到一个Customer类类型要记录该怎么做。
这种配置可以直接在对象的代码上进行,也可以在目标XML配置上进行。如果一个对象同时定义了两种配置,XML将优先。
在代码中,需要告诉NLog这个类是要被记录的,以及哪些属性是要被记录的。为此,有以下属性:
可以随时添加或删除属性。
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。在此之后,进行了一些侧向开发,可能会发现它们很有趣: