zoukankan      html  css  js  c++  java
  • 使用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);
     }
    

     注意,设置数据库时,时间要为字符串类型。

  • 相关阅读:
    【转】VS2010中 C++创建DLL图解
    [转]error: 'retainCount' is unavailable: not available in automatic reference counting mode
    [转]关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法
    【转】 Tomcat v7.0 Server at localhost was unable to start within 45
    【转】Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If
    【转】SVN管理多个项目版本库
    【转】eclipse安装SVN插件的两种方法
    【转】MYSQL启用日志,和查看日志
    【转】Repository has not been enabled to accept revision propchanges
    【转】SVN库的迁移
  • 原文地址:https://www.cnblogs.com/lgx5/p/10158776.html
Copyright © 2011-2022 走看看