本文转自:.html
摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中。本文为你介绍C# 使用Nlog记录日志到数据库。
Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中。
可以在这里下载Nlog:/
这里分享一下如何配置Nlog,可以使其日志记录到数据库中(这里我用的是SQL server 2008)。
新建一个控件台项目:NlogSample,再通过NuGet加入Nlog程序集,如果没有装NuGet也可以在Nlog官网上下载,:
安装好以后,在项目中就有了Nlog程序集和fig文件。
打开fig文件,在target节点中,增加对数据库的配置。
View Code<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是参数信息。当然在记录之前我们要先在数据库中建好相应的表。
在fig中的rule中增加日志记录规则:
View Code<rules><!-- add your logging rules here --><logger name="*" writeTo="database"/> <!-- <logger name="*" minlevel="Trace" writeTo="f" /> --> </rules>
这样,我们的fig就设置好了。在Main方法中写几句代码测试一下:
View Codeclass 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.MainView Code
我们也可以将日志等级比较低的记录到文本,只将比较严重的日志记录到数据库中,相应的fig如下:
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns=".xsd" xmlns:xsi="" throwExceptions="true" internalLogFile="c:" internalLogLevel="Debug"> <!-- See for information on customizing logging rules and outputs. --> <!--<nlog throwExceptions="true" internalLogFile="c:" 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:" internalLogLevel="Debug" ,可以让我们看到Nlog的内部错误,对调试有很大的帮助。
这里也许有人要问,上面日志表中的参数${longdate},${level} 等都是Nlog内部恰好有提供的,要是我要记录的信息Nlog没有怎么办?没问题,我们完全可以自己定义日志表的数据结构。
重新配置Nlog.Config如下:
View Code<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns=".xsd" xmlns:xsi="" throwExceptions="true" internalLogFile="c:" internalLogLevel="Debug"> <!-- See 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 类给我们的参数赋值,代码如下:
View Codevoid 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); }
转载于:.html
本文发布于:2024-02-01 13:36:01,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170676576136975.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |