您的位置:首页 > 数据库

使用NLog记录业务日志到数据库

2015-09-28 16:17 459 查看
项目中很多时候要记录业务日志,其实是可以直接用日志框架计入数据库的.

使用NLog并不是只能将日志主体插入数据库,而是可以根据实际情况自定义任意列记入.非常方便.而且很容易实现

下面是用NLog记录业务日志到数据库

1.首先下载NLog的DLL,下载地址
https://github.com/NLog/NLog
2.项目里面引用NLog.dll

3.创建一个日志工具类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NLog;

namespace LN.Tool
{

public class DBLog
{
readonly static Logger processLogger = LogManager.GetLogger("LnProcessDBLog");

public static void Process(string key,string userName, string orderNo, string content, string keyWord)
{
LogEventInfo theEvent = new LogEventInfo(LogLevel.Info, "", content);
theEvent.Properties["RequestKey"] = key;
theEvent.Properties["UserName"] = userName;
theEvent.Properties["OrderNo"] = orderNo;
theEvent.Properties["KeyWord"] = keyWord;
processLogger.Log(theEvent);
}

public static void Flush()
{
LogManager.Flush();
}
}
}


4.然后在 Global.asax的Application_End中加入 DBLog.Flush();用来在网站停止时,将日志全部插入

protected void Application_End(object sender, EventArgs e)
{
DBLog.Flush();
}


5.在网站根目录添加NLog.config文件

<nlog  xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true">
<targets>
<default-wrapper xsi:type="BufferingWrapper" bufferSize="100" FlushTimeout="10000">
<wrapper-target xsi:type="AsyncWrapper"/>
</default-wrapper>
<!-- write logs to file -->
<target xsi:type="File" name="LnProcessDBLogTarget2" fileName="D://logs/${shortdate}.log"
layout="${longdate} ${event-properties:item=RequestKey} ${event-properties:item=UserName} ${event-properties:item=OrderNo}  ${message} ${event-properties:item=KeyWord}"  />
<target xsi:type="Database" name="LnProcessDBLogTarget">
<!-- SQL command to be executed for each entry -->
<commandText>INSERT INTO [LogEntries](RequestKey, UserName,OrderNo,[Content],KeyWord,LogTime,CTime)
VALUES(@RequestKey,@UserName,@OrderNo,@Content,@KeyWord,@LogTime,getdate())</commandText>
<!-- parameters for the command -->
<parameter name="@RequestKey" layout="${event-properties:item=RequestKey}" />
<parameter name="@UserName" layout="${event-properties:item=UserName}" />
<parameter name="@OrderNo" layout="${event-properties:item=OrderNo}" />
<parameter name="@Content" layout=" ${message}" />
<parameter name="@KeyWord" layout="${event-properties:item=KeyWord}" />
<parameter name="@LogTime" layout="${longdate}" />

<!-- connection string -->
<dbProvider>System.Data.SqlClient</dbProvider>
<connectionString>server=.\SQLEXPRESS;database=MyLogs;integrated security=sspi</connectionString>
</target>
</targets>
<rules>
<logger name="LnProcessDBLog" minlevel="Trace" writeTo="LnProcessDBLogTarget" final="true"  />
<logger name="*" minlevel="Trace" writeTo="LnProcessDBLogTarget2" />
</rules>
</nlog>


6.数据库创建表

CREATE TABLE [dbo].[LogEntries](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[RequestKey] [varchar](50) NOT NULL,
[UserName] [varchar](50) NOT NULL,
[OrderNo] [varchar](50) NOT NULL,
[Content] [varchar](5000) NOT NULL,
[KeyWord] [varchar](500) NOT NULL,
[LogTime] [datetime2](7) NOT NULL,
[CTime] [datetime] NOT NULL,
CONSTRAINT [PK_LogEntries] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


这样就大功告成了,在插入日志的地方写就可以了

DBLog.Process(key, "lnUserName", "O001OrderNo", key + "执行" + DateTime.Now, "K1KeyWord");

其中RequestKey等参数可以根据实际情况自己定义

<default-wrapper xsi:type="BufferingWrapper" bufferSize="100" FlushTimeout="10000">
<wrapper-target xsi:type="AsyncWrapper"/>
</default-wrapper>


这几句是用来设置如何插入的

<wrapper-target xsi:type="AsyncWrapper"/>表示异步插入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: