[转]C# 使用Nlog记录日志到数据库

正文转自:http://www.cnblogs.com/weixing/archive/2013/04/26/3044422.html

摘要]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节点受到,增加对数据库的配置。

C# 1C# 2View
Code

C# 3😉

<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>

C# 4😉

其中:connectionstring举凡数据库连接串,commandText凡是插的SQL语句,parameter是参数信息。当然在笔录之前我们设事先在数据库被盖好相应的说明。

于Nlog.config中的rule中追加日志记录规则:

C# 5C# 6View
Code

C# 7😉

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

C# 8😉

这般,我们的Nlog.config就安装好了。在Main方法被描写几句子代码测试一下:

C# 9C# 10View
Code

C# 11😉

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

C# 12😉

履行成功,数据库中曾经多一漫漫日志记录了:

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如下:

C# 13C# 14View
Code

<?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如下:

C# 15C# 16View
Code

C# 17😉

<?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>

C# 18😉

类<parameter name=”@appName”
layout=”${event-context:item=appName}”/> ,我们就可以定义自己的参数。

接下来于形容日记的下,可以透过LogEventInfo 类给咱们的参数赋值,代码如下:

C# 19C# 20View
Code

C# 21😉

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);
        }

C# 22😉

 

 

相关文章