使用Nlog记录日志到数据库
Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中。
可以在这里下载Nlog:http://nlog-project.org/
这里分享一下如何配置Nlog,可以使其日志记录到数据库中(这里我用的是SQL server 2008).
新建一个控件台项目:NlogSample,再通过NuGet加入Nlog程序集,如果没有装NuGet也可以在Nlog官网上下载,如图:

安装好以后,在项目中就有了Nlog程序集和Nlog.config文件
打开Nlog.config文件,在target节点中,增加对数据库的配置。

<target type="Database" name="database" connectionstring="Data Source=.;Initial Catalog=ReportServerTempDB;Integrated Security=True">
<commandText>
insert into MyLog ([CreateDate], [Origin], [LogLevel], [Message], [StackTrace]) values (@createDate, @origin, @logLevel, @message, @stackTrace);
</commandText>
<parameter name="@createDate" layout="${longdate}"/>
<!--日志发生时间-->
<parameter name="@origin" layout="${callsite}"/>
<!--日志来源-->
<parameter name="@logLevel" layout="${level}"/>
<!--日志等级-->
<parameter name="@message" layout="${message}"/>
<!--日志信息-->
<parameter name="@stackTrace" layout="${stacktrace}"/>
<!--堆栈信息-->
</target>

其中:connectionstring是数据库连接串,commandText是插入的SQL语句,parameter 是参数信息。当然在记录之前我们要先在数据库中建好相应的表。
在Nlog.config中的rule中增加日志记录规则

<rules>
<!-- add your logging rules here -->
<logger name="*" writeTo="database"/>
<!--
<logger name="*" minlevel="Trace" writeTo="f" />
-->
</rules>

这样,我们的Nlog.config就设置好了。在Main方法中写几句代码测试一下:

class Program
{
private static Logger logger = LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
logger.Fatal("发生致命错误");
}
}

执行成功,数据库中已经增加一条日志记录了
LigID CreateDate Origin LogLevel Message Exception StackTrace
20 2012-10-18 15:49:16.4114 NlogSample.Program.Main Fatal 发生致命错误 NULL AppDomain.ExecuteAssembly => AppDomain._nExecuteAssembly => Program.Main
我们也可以将日志等级比较低的记录到文本,只将比较严重的日志记录到数据库中,相应的Nlog.config如下:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
throwExceptions="true" internalLogFile="c:\nlog.txt" internalLogLevel="Debug"> <!--
See http://nlog-project.org/wiki/Configuration_file
for information on customizing logging rules and outputs.
-->
<!--<nlog throwExceptions="true" internalLogFile="c:\nlog.txt" internalLogLevel="Debug" />-->
<targets>
<!-- add your targets here -->
<target name="file" xsi:type="File" fileName="${basedir}/logs/Log ${shortdate}.txt" layout="${longdate} ${callsite} ${level}: ${message} ${event-context:item=exception} ${stacktrace}" />
<target type="Database" name="database" connectionstring="Data Source=.;Initial Catalog=ReportServerTempDB;Integrated Security=True">
<commandText>
insert into MyLog ([CreateDate], [Origin], [LogLevel], [Message], [StackTrace]) values (@createDate, @origin, @logLevel, @message, @stackTrace);
</commandText>
<parameter name="@createDate" layout="${longdate}"/><!--日志发生时间-->
<parameter name="@origin" layout="${callsite}"/><!--日志发生时间-->
<parameter name="@logLevel" layout="${level}"/><!--日志等级-->
<parameter name="@message" layout="${message}"/><!--日志信息-->
<parameter name="@stackTrace" layout="${stacktrace}"/><!--日志发生时间-->
</target>
<!--
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
-->
</targets> <rules>
<!-- add your logging rules here -->
<logger name="*" writeTo="file"/>
<logger name="*" minlevel="Error" appendTo="database"/>
<!--
<logger name="*" minlevel="Trace" writeTo="f" />
-->
</rules>
</nlog>

在根结点上设置:throwExceptions="true" internalLogFile="c:\nlog.txt" internalLogLevel="Debug" ,可以让我们看到Nlog的内部错误,对调试有很大的帮助。
这里也许有人要问,上面日志表中的参数${longdate},${level} 等都是Nlog内部恰好有提供的,要是我要记录的信息Nlog没有怎么办?没问题,我们完全可以自己定义日志
表的数据结构。
重新配置Nlog.Config如下:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
throwExceptions="true" internalLogFile="c:\nlog1.txt" internalLogLevel="Debug"> <!--
See http://nlog-project.org/wiki/Configuration_file
for information on customizing logging rules and outputs.
-->
<targets>
<!-- add your targets here -->
<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"
layout="${longdate} ${level}:${event-context:item=logMessage}" />
<target name="fi" xsi:type="File" fileName="${basedir}/logs/Log ${shortdate}.txt"
layout="${longdate} ${level}:${message} ${stacktrace}" />
<target type="Database" name="database" connectionstring="Data Source=.;Initial Catalog=ReportServerTempDB;Integrated Security=True">
<commandText>
insert into DevLog ([AppName],[ModuleName],[ProcName],[LogLevel],[LogTitle],[LogMessage],[LogDate],[StackTrace]) values (@appName, @moduleName, @procName, @logLevel, @logTitle, @logMessage,@logDate,@stackTrace);
</commandText>
<parameter name="@appName" layout="${event-context:item=appName}"/>
<parameter name="@moduleName" layout="${event-context:item=moduleName}"/>
<parameter name="@procName" layout="${event-context:item=procName}"/>
<parameter name="@logLevel" layout="${event-context:item=logLevel}"/>
<parameter name="@logTitle" layout="${event-context:item=logTitle}"/>
<parameter name="@logMessage" layout="${event-context:item=logMessage}"/>
<parameter name="@logDate" layout="${longdate}"/>
<parameter name="@stackTrace" layout="${stacktrace}"/>
</target>
<!--
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
-->
</targets> <rules>
<!-- add your logging rules here -->
<logger name="Log" writeTo="file"/>
<logger name="L" writeTo="fi"/>
<!--<logger name="Log" minlevel="Info" appendTo="database"/>-->
<!--
<logger name="*" minlevel="Trace" writeTo="f" />
-->
</rules>
</nlog>

类似<parameter name="@appName" layout="${event-context:item=appName}"/> ,我们就可以定义自己的参数。
然后在写日志的时候,可以通过LogEventInfo 类给我们的参数赋值,代码如下:

void WriteLog(LogLevel levle, string appName, string moduleName, string procName, string logLevel, string logTitle, string logMessage)
{
LogEventInfo ei = new LogEventInfo(levle, "", "");
ei.Properties["appName"] = appName;
ei.Properties["moduleName"] = moduleName;
ei.Properties["procName"] = procName;
ei.Properties["logLevel"] = logLevel.ToUpper();
ei.Properties["logTitle"] = logTitle;
ei.Properties["logMessage"] = logMessage;
logger.Log(ei);
}

示例项目下载:点我
注意,设置数据库时,时间要为字符串类型。
使用Nlog记录日志到数据库的更多相关文章
- [转]C# 使用Nlog记录日志到数据库
本文转自:http://www.cnblogs.com/weixing/archive/2013/04/26/3044422.html 摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输 ...
- C# 使用Nlog记录日志到数据库 使用LogEventInfo类获取,命名空间名称、类名、方法名
原文地址:http://dotnet.9sssd.com/csbase/art/793 [摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数 ...
- C# 使用Nlog记录日志到数据库
[摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中.本文为你介绍C# 使用Nlog记录日志到数据库. Nlog是一个很不错的.NET ...
- 转:使用Nlog记录日志到数据库
原文:http://www.cnblogs.com/Gyoung/archive/2012/10/18/2729613.html Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台, ...
- 从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之四Nlog记录日志至数据库
为什么要进行日志记录呢?为什么要存至数据库呢?只能说日志记录是每个系统都应当有的. 好的日志记录方式可以提供我们足够多定位问题的依据.查找系统或软件或项目的错误或异常记录.程序在运行时就像一个机器人, ...
- .Net Core 使用NLog记录日志到文件和数据库
NLog 记录日志是微软官方推荐使用. 接下来,通过配置日志记录到文件和Sql Server数据库. 第一步:首先添加包NLog.Config (可通过微软添加包命令Install-Package 包 ...
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
EF+LINQ事物处理 在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...
- Asp.Net Core中使用NLog记录日志
2019/10/28, Asp.Net Core 3.0, NLog 4.6.7, NLog.Web.AspNetCore 4.9.0 摘要:NLog在asp.net网站中的使用,NLog日志写入数据 ...
- .NET中使用NLog记录日志
以前小编记录日志使用的是Log4Net,虽然好用但和NLog比起来稍显复杂.下面小编就和大伙分享一下NLog的使用方式. 引用NLog.Config 在使用NLog之前,我们要首先添加对NLog.Co ...
随机推荐
- Openjudge计算概论-单词翻转
/*===================================== 单词翻转 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个句子(一行),将句子中的每一个单词翻转后 ...
- linux 下查看机器是cpu是几核的
几个cpu more /proc/cpuinfo |grep "physical id"|uniq|wc -l 每个cpu是几核(假设cpu配置相同) more /proc/cpu ...
- html之span标签
对于文档中的行内元素最好使用span来组合它们,这样就可以通过样式来格式化它们. span没有任何的样式,当对它应用样式时,才会产生变化 id和class属性是span标签的好伴侣,这样做既可以增加适 ...
- 转:Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)
Scrapy在window上的安装教程见下面的链接:Scrapy安装教程 上述安装教程已实践,可行.(本来打算在ubuntu上安装Scrapy的,但是Ubuntu 磁盘空间太少了,还没扩展磁盘空间,所 ...
- bootstrap3-typeahead 自动补全
很酷的一个自动补全插件 http://twitter.github.io/typeahead.js 在bootstrap中使用typeahead插件,完成自动补全 相关的文档:https://gith ...
- 持续集成之Jenkins(坏老头)
点击关注哦↑↑↑↑↑↑↑↑↑ 持续集成 有关持续集成的简介,可参考我此前的文章:http://blog.csdn.net/benkaoya/article/details/44993583 Jenki ...
- ASP.NET让FileUpload控件支持浏览自动上传功能的解决方法
ASP.NET的FileUpload控件默认是不支持服务端的onchange事件的,此时可以用一种变通的方法来实现这一功能. 这就需要借用客户端的onchange事件,调用__doPostBack方法 ...
- C转义字符
C语言输出特殊字符 C语言转义字符意义大体同于前面的C#转义字符,这里列出用c语言,输出%d.\n等特殊字符的方法. #include <stdio.h> int main() { pri ...
- Zabbix的安装与部署---问题处理(php65.6.28 mysqli 报错误 处理)
1)php65.6.28 mysqli 报错误 处理 http://www.xiaochengfu.com/index.php/index/detail/aid/92.html 2)linux下p ...
- PO、VO、BO、DTO
J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了(听过老罗对这种现象的批判的朋 ...