zoukankan      html  css  js  c++  java
  • C# 使用Nlog记录日志到数据库 使用LogEventInfo类获取,命名空间名称、类名、方法名

    原文地址:http://dotnet.9sssd.com/csbase/art/793 

    [摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中。本文为你介绍C# 使用Nlog记录日志到数据库。

    Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中。

    可以在这里下载Nlog:http://nlog-project.org/

    这里分享一下如何配置Nlog,可以使其日志记录到数据库中(这里我用的是SQL server 2008)。

    新建一个控件台项目:NlogSample,再通过NuGet加入Nlog程序集,如果没有装NuGet也可以在Nlog官网上下载,如图:

    NuGet NLog

    安装好以后,在项目中就有了Nlog程序集和Nlog.config文件。

    打开Nlog.config文件,在target节点中,增加对数据库的配置。

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

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

    在Nlog.config中的rule中增加日志记录规则:

    1 <rules>
    2 <!-- add your logging rules here -->
    3 <logger name="*" writeTo="database"/>
    4 <!--
    5 <logger name="*" minlevel="Trace" writeTo="f" />
    6 -->
    7 </rules>

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

    1 class Program
    2 {
    3 private static Logger logger = LogManager.GetCurrentClassLogger();
    4 static void Main(string[] args)
    5 {
    6 logger.Fatal("发生致命错误");
    7 }
    8 }

    执行成功,数据库中已经增加一条日志记录了:

    1 LigID CreateDate Origin LogLevel Message Exception StackTrace
    2 20 2012-10-18 15:49:16.4114 NlogSample.Program.Main Fatal 发生致命错误 NULL AppDomain.ExecuteAssembly => AppDomain._nExecuteAssembly => Program.Main

    我们也可以将日志等级比较低的记录到文本,只将比较严重的日志记录到数据库中,相应的Nlog.config如下:

    1 <?xml version="1.0" encoding="utf-8" ?>
    2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4 throwExceptions="true" internalLogFile="c: log.txt" internalLogLevel="Debug">
    5  
    6 <!--
    7 See http://nlog-project.org/wiki/Configuration_file
    8 for information on customizing logging rules and outputs.
    9 -->
    10 <!--<nlog throwExceptions="true" internalLogFile="c: log.txt" internalLogLevel="Debug" />-->
    11 <targets>
    12 <!-- add your targets here -->
    13 <target name="file" xsi:type="File" fileName="${basedir}/logs/Log ${shortdate}.txt" layout="${longdate} ${callsite} ${level}: ${message} ${event-context:item=exception} ${stacktrace}" />
    14 <target type="Database" name="database" connectionstring="Data Source=.;Initial Catalog=ReportServerTempDB;Integrated Security=True">
    15 <commandText>
    16 insert into MyLog ([CreateDate], [Origin], [LogLevel], [Message], [StackTrace]) values (@createDate, @origin, @logLevel, @message, @stackTrace);
    17 </commandText>
    18 <parameter name="@createDate" layout="${longdate}"/><!--日志发生时间-->
    19 <parameter name="@origin" layout="${callsite}"/><!--日志发生时间-->
    20 <parameter name="@logLevel" layout="${level}"/><!--日志等级-->
    21 <parameter name="@message" layout="${message}"/><!--日志信息-->
    22 <parameter name="@stackTrace" layout="${stacktrace}"/><!--日志发生时间-->
    23 </target>
    24 <!--
    25 <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
    26 layout="${longdate} ${uppercase:${level}} ${message}" />
    27 -->
    28 </targets>
    29  
    30 <rules>
    31 <!-- add your logging rules here -->
    32 <logger name="*" writeTo="file"/>
    33 <logger name="*" minlevel="Error" appendTo="database"/>
    34 <!--
    35 <logger name="*" minlevel="Trace" writeTo="f" />
    36 -->
    37 </rules>
    38 </nlog>

    在根结点上设置:throwExceptions="true" internalLogFile="c: log.txt" internalLogLevel="Debug" ,可以让我们看到Nlog的内部错误,对调试有很大的帮助。

    这里也许有人要问,上面日志表中的参数${longdate},${level} 等都是Nlog内部恰好有提供的,要是我要记录的信息Nlog没有怎么办?没问题,我们完全可以自己定义日志表的数据结构。

    重新配置Nlog.Config如下:

    1 <?xml version="1.0" encoding="utf-8" ?>
    2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4 throwExceptions="true" internalLogFile="c: log1.txt" internalLogLevel="Debug">
    5  
    6 <!--
    7 See http://nlog-project.org/wiki/Configuration_file
    8 for information on customizing logging rules and outputs.
    9 -->
    10 <targets>
    11 <!-- add your targets here -->
    12 <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"
    13 layout="${longdate} ${level}:${event-context:item=logMessage}" />
    14 <target name="fi" xsi:type="File" fileName="${basedir}/logs/Log ${shortdate}.txt"
    15 layout="${longdate} ${level}:${message} ${stacktrace}" />
    16 <target type="Database" name="database" connectionstring="Data Source=.;Initial Catalog=ReportServerTempDB;Integrated Security=True">
    17 <commandText>
    18 insert into DevLog ([AppName],[ModuleName],[ProcName],[LogLevel],[LogTitle],[LogMessage],[LogDate],[StackTrace]) values (@appName, @moduleName, @procName, @logLevel, @logTitle, @logMessage,@logDate,@stackTrace);
    19 </commandText>
    20 <parameter name="@appName" layout="${event-context:item=appName}"/>
    21 <parameter name="@moduleName" layout="${event-context:item=moduleName}"/>
    22 <parameter name="@procName" layout="${event-context:item=procName}"/>
    23 <parameter name="@logLevel" layout="${event-context:item=logLevel}"/>
    24 <parameter name="@logTitle" layout="${event-context:item=logTitle}"/>
    25 <parameter name="@logMessage" layout="${event-context:item=logMessage}"/>
    26 <parameter name="@logDate" layout="${longdate}"/>
    27 <parameter name="@stackTrace" layout="${stacktrace}"/>
    28 </target>
    29 <!--
    30 <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
    31 layout="${longdate} ${uppercase:${level}} ${message}" />
    32 -->
    33 </targets>
    34  
    35 <rules>
    36 <!-- add your logging rules here -->
    37 <logger name="Log" writeTo="file"/>
    38 <logger name="L" writeTo="fi"/>
    39 <!--<logger name="Log" minlevel="Info" appendTo="database"/>-->
    40 <!--
    41 <logger name="*" minlevel="Trace" writeTo="f" />
    42 -->
    43 </rules>
    44 </nlog>

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

    然后在写日志的时候,可以通过LogEventInfo 类给我们的参数赋值,代码如下:

    1 void WriteLog(LogLevel levle, string appName, string moduleName, string procName, string logLevel, string logTitle, string logMessage)
    2 {
    3 LogEventInfo ei = new LogEventInfo(levle, "", "");
    4 ei.Properties["appName"] = appName;
    5 ei.Properties["moduleName"] = moduleName;
    6 ei.Properties["procName"] = procName;
    7 ei.Properties["logLevel"] = logLevel.ToUpper();
    8 ei.Properties["logTitle"] = logTitle;
    9 ei.Properties["logMessage"] = logMessage;
    10 logger.Log(ei);
    11 }
  • 相关阅读:
    根据科目计算父科目ID,并递归累计求父科目的金额
    xshell连接中标麒麟
    查看linux版本
    虚拟机的Vmtools
    apt-get和yum
    1264
    使用navicat的坑
    Qt bug
    模板函数举例
    头文件里声明和定义,Qt编译不过问题
  • 原文地址:https://www.cnblogs.com/niaowo/p/4785472.html
Copyright © 2011-2022 走看看