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

2023-12-24 13:20

本文主要是介绍[转]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节点中,增加对数据库的配置。

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是参数信息。当然在记录之前我们要先在数据库中建好相应的表。

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

View Code
复制代码
<rules><!-- add your logging rules here --><logger name="*" writeTo="database"/> <!-- <logger name="*" minlevel="Trace" writeTo="f" /> --> </rules>
复制代码

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

View Code
复制代码
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如下:
View 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如下:

View 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:\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>
复制代码

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

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

View Code
复制代码
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); }
复制代码

 

 

转载于:https://www.cnblogs.com/freeliver54/p/6251305.html

这篇关于[转]C# 使用Nlog记录日志到数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_30347009/article/details/97720025
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/531922

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进