您的位置:首页 > 数据库

C# 使用Nlog记录日志到数据库 使用LogEventInfo类获取,命名空间名称、类名、方法名

2015-09-06 14:23 971 查看
原文地址:http://dotnet.9sssd.com/csbase/art/793

[摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中。本文为你介绍C# 使用Nlog记录日志到数据库。

Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中。

可以在这里下载Nlog:http://nlog-project.org/

这里分享一下如何配置Nlog,可以使其日志记录到数据库中(这里我用的是SQL server 2008)。

新建一个控件台项目:NlogSample,再通过NuGet加入Nlog程序集,如果没有装NuGet也可以在Nlog官网上下载,如图:



安装好以后,在项目中就有了Nlog程序集和Nlog.config文件。

打开Nlog.config文件,在target节点中,增加对数据库的配置。

View Row Code
1<target type="Database" name="database" connectionstring="Data Source=.;Initial Catalog=ReportServerTempDB;Integrated Security=True">
2<commandText>
3insert into MyLog ([CreateDate], [Origin], [LogLevel], [Message], [StackTrace]) values (@createDate, @origin, @logLevel, @message, @stackTrace);
4</commandText>
5<parameter name="@createDate" layout="${longdate}"/>
6<!--日志发生时间-->
7<parameter name="@origin" layout="${callsite}"/>
8<!--日志来源-->
9<parameter name="@logLevel" layout="${level}"/>
10<!--日志等级-->
11<parameter name="@message" layout="${message}"/>
12<!--日志信息-->
13<parameter name="@stackTrace" layout="${stacktrace}"/>
14<!--堆栈信息-->
15</target>
其中:connectionstring是数据库连接串,commandText是插入的SQL语句,parameter 是参数信息。当然在记录之前我们要先在数据库中建好相应的表。

在Nlog.config中的rule中增加日志记录规则:

View Row Code
1<rules>
2<!-- add your logging rules here -->
3<logger name="*" writeTo="database"/>
4<!--
5<logger name="*" minlevel="Trace" writeTo="f" />
6-->
7</rules>
这样,我们的Nlog.config就设置好了。在Main方法中写几句代码测试一下:

View Row Code
1class Program
2{
3private static Logger logger = LogManager.GetCurrentClassLogger();
4static void Main(string[] args)
5{
6logger.Fatal("发生致命错误");
7}
8}
执行成功,数据库中已经增加一条日志记录了:

View Row Code
1LigID CreateDate Origin LogLevel Message Exception StackTrace
220 2012-10-18 15:49:16.4114 NlogSample.Program.Main Fatal 发生致命错误 NULL AppDomain.ExecuteAssembly => AppDomain._nExecuteAssembly => Program.Main
我们也可以将日志等级比较低的记录到文本,只将比较严重的日志记录到数据库中,相应的Nlog.config如下:

View Row Code
1<?xml version="1.0" encoding="utf-8" ?>
2<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
3xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4throwExceptions="true" internalLogFile="c:\nlog.txt" internalLogLevel="Debug">
5
6<!--
7See http://nlog-project.org/wiki/Configuration_file
8for information on customizing logging rules and outputs.
9-->
10<!--<nlog throwExceptions="true" internalLogFile="c:\nlog.txt" internalLogLevel="Debug" />-->
11<targets>
12<!-- add your targets here -->
13<target name="file" xsi:type="File" fileName="${basedir}/logs/Log ${shortdate}.txt" layout="${longdate} ${callsite} ${level}: ${message} ${event-context:item=exception} ${stacktrace}" />
14<target type="Database" name="database" connectionstring="Data Source=.;Initial Catalog=ReportServerTempDB;Integrated Security=True">
15<commandText>
16insert into MyLog ([CreateDate], [Origin], [LogLevel], [Message], [StackTrace]) values (@createDate, @origin, @logLevel, @message, @stackTrace);
17</commandText>
18<parameter name="@createDate" layout="${longdate}"/><!--日志发生时间-->
19<parameter name="@origin" layout="${callsite}"/><!--日志发生时间-->
20<parameter name="@logLevel" layout="${level}"/><!--日志等级-->
21<parameter name="@message" layout="${message}"/><!--日志信息-->
22<parameter name="@stackTrace" layout="${stacktrace}"/><!--日志发生时间-->
23</target>
24<!--
25<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
26layout="${longdate} ${uppercase:${level}} ${message}" />
27-->
28</targets>
29
30<rules>
31<!-- add your logging rules here -->
32<logger name="*" writeTo="file"/>
33<logger name="*" minlevel="Error" appendTo="database"/>
34<!--
35<logger name="*" minlevel="Trace" writeTo="f" />
36-->
37</rules>
38</nlog>
在根结点上设置:throwExceptions="true" internalLogFile="c:\nlog.txt" internalLogLevel="Debug" ,可以让我们看到Nlog的内部错误,对调试有很大的帮助。

这里也许有人要问,上面日志表中的参数${longdate},${level} 等都是Nlog内部恰好有提供的,要是我要记录的信息Nlog没有怎么办?没问题,我们完全可以自己定义日志表的数据结构。

重新配置Nlog.Config如下:

View Row Code
1<?xml version="1.0" encoding="utf-8" ?>
2<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
3xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4throwExceptions="true" internalLogFile="c:\nlog1.txt" internalLogLevel="Debug">
5
6<!--
7See http://nlog-project.org/wiki/Configuration_file
8for information on customizing logging rules and outputs.
9-->
10<targets>
11<!-- add your targets here -->
12<target name="file" xsi:type="File" fileName="D:\ProcLogs/${event-context:item=appName}/${event-context:item=moduleName}/${event-context:item=procName}/${event-context:item=logTitle}/${shortdate}-${level}.txt"
13layout="${longdate} ${level}:${event-context:item=logMessage}" />
14<target name="fi" xsi:type="File" fileName="${basedir}/logs/Log ${shortdate}.txt"
15layout="${longdate} ${level}:${message} ${stacktrace}" />
16<target type="Database" name="database" connectionstring="Data Source=.;Initial Catalog=ReportServerTempDB;Integrated Security=True">
17<commandText>
18insert into DevLog ([AppName],[ModuleName],[ProcName],[LogLevel],[LogTitle],[LogMessage],[LogDate],[StackTrace]) values (@appName, @moduleName, @procName, @logLevel, @logTitle, @logMessage,@logDate,@stackTrace);
19</commandText>
20<parameter name="@appName" layout="${event-context:item=appName}"/>
21<parameter name="@moduleName" layout="${event-context:item=moduleName}"/>
22<parameter name="@procName" layout="${event-context:item=procName}"/>
23<parameter name="@logLevel" layout="${event-context:item=logLevel}"/>
24<parameter name="@logTitle" layout="${event-context:item=logTitle}"/>
25<parameter name="@logMessage" layout="${event-context:item=logMessage}"/>
26<parameter name="@logDate" layout="${longdate}"/>
27<parameter name="@stackTrace" layout="${stacktrace}"/>
28</target>
29<!--
30<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
31layout="${longdate} ${uppercase:${level}} ${message}" />
32-->
33</targets>
34
35<rules>
36<!-- add your logging rules here -->
37<logger name="Log" writeTo="file"/>
38<logger name="L" writeTo="fi"/>
39<!--<logger name="Log" minlevel="Info" appendTo="database"/>-->
40<!--
41<logger name="*" minlevel="Trace" writeTo="f" />
42-->
43</rules>
44</nlog>
类似<parameter name="@appName" layout="${event-context:item=appName}"/> ,我们就可以定义自己的参数。

然后在写日志的时候,可以通过LogEventInfo 类给我们的参数赋值,代码如下:

View Row Code
1void WriteLog(LogLevel levle, string appName, string moduleName, string procName, string logLevel, string logTitle, string logMessage)
2{
3LogEventInfo ei = new LogEventInfo(levle, "", "");
4ei.Properties["appName"] = appName;
5ei.Properties["moduleName"] = moduleName;
6ei.Properties["procName"] = procName;
7ei.Properties["logLevel"] = logLevel.ToUpper();
8ei.Properties["logTitle"] = logTitle;
9ei.Properties["logMessage"] = logMessage;
10logger.Log(ei);
11}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: