zoukankan      html  css  js  c++  java
  • C# 使用Nlog记录日志到数据库

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

    复制代码
    <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:
    log.txt" internalLogLevel="Debug">
    
      <!-- 
      See http://nlog-project.org/wiki/Configuration_file 
      for information on customizing logging rules and outputs.
       -->
      <!--<nlog throwExceptions="true" internalLogFile="c:
    log.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: log.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:
    log1.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);
            }
  • 相关阅读:
    Android中Context具体解释 ---- 你所不知道的Context
    JDK6、Oracle11g、Weblogic10 For Linux64Bit安装部署说明
    matplotlib 可视化 —— 定制 matplotlib
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    指数函数的研究
    指数函数的研究
    指数分布的研究
  • 原文地址:https://www.cnblogs.com/itjeff/p/6379501.html
Copyright © 2011-2022 走看看