Log4Net 全方“.NET技术”位跟踪程序运行

  前端日子自己写了一个简单的日志跟踪程序,现在目前正在做的一个项目中使用以便于跟踪程序异常和运行状况,但是被否认了!可能是没有权威性,于是自己总结了一下Log4net日志跟踪系统,这里分享大家学习一下。当然写这个文章的人太多了,这里不是做任何攀比,只是简单的分享供有需要的人。

  一. Log4Net 简介

  Log4net 是 Apache 下一个开放源码的项目,它是Log4j 的一个克隆版。我们可以控制日志信息的输出目的地。Log4net中定义了多种日志信息输出模式。 

  在做项目的时候令我最头疼的是在程序发布到正式环境之后出现了问题,我们不能调试而且问题很难重新,于是我们需要大量的日志数据来精确的跟踪程序的运行状况。 

  Log4net就可以帮我来解决这一个难题,对于日志的输出我们不需要人为的去干涉,它可以根据需要将日志输出到控制台,文本文件,windows 日志事件查看器中,包括数据库,邮件等等位置,以便我们快速跟踪程序bug。 

  二. Log4Net 简单使用

  使用Log4net必须引入log4net.dll 文件,因为log4net 是开源的,所以可以直接将源码添加到工程项目中去。然后生成新的dll文件。

  下面使用配置一个最简单的文件输出和控制台输出。 

  Log4Net 的配置文件,此段内容添加到App.config 或者 web.config 文件中:


<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="D:\a.log"></file>
<appendToFile value="true"></appendToFile>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%d]:%n%m%n"></conversionPattern>
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%d]:%n%m%n"></conversionPattern>
</layout>
</appender>
<root>
<level value="INFO"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</root>
<logger name="MyLogger">
<level value="ERROR"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
</ log4net>

  控制台程序测试例子:


ILog log = LogManager.GetLogger("MyLogger");
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
Program program = new Program();
program.log.Info(">>>>>>>>>>>>>>上海企业网站制作tyle="color: #800000;">");
program.log.Info(">>>>>>>>>>>>>>1");
program.log.Info(">>>>>>>>>>>>>>2");
}

  对于已经熟练使用log4net的同学们来说,这段代码自然是小儿科。但对于新手来说这段配置理解还是有一定难度的,下面逐步解说配置以及程序的使用。在实际应用中log4net可能要比更加复杂,它要根据各种环境和要求来引用生成不同的日志。上面的程序代码只是将日志以文件格式和控制格式输出。如果有兴趣,可以将上述代码拷贝到自己的程序中去运行一次看看结果。上述例子是不会输出任何日志信息的,因为配置级别的限制。 

  三. Log4Net 结构

  Log4net 主要分为5个核心组件: Logger, Appender, Filter, Layout, Object Render。 

  Logger: 

  主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。上面的简单例子我们看似做了日志输出,但是没有输出任何日志结果,因为我们在日志级别上做了限制。 

  Appender: 

  这里我们简单称之为“附着器”。意思就是说日志的输出必须依赖于它,更确切的说以文本形式输出,还是控制台格式输出都必须要依靠它来控制。Log4net定义了多种附着器:

  (1) AdoNetAppender 将日志记录到数据库中。可以采用SQL和存储过程两种方式 。

  (2) AnsiColorTerminalAppender 在ANSI 窗口终端写下高亮度的日志事件。 

  (3) AspNetTraceAppender 能用asp.net中Trace的方式查看记录的日志。

  (4) BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件。

  (5) ConsoleAppender 将日志输出到控制台。

  (6) EventLogAppender 将日志写到Windows Event Log。

  (7) FileAppender 将日志写到文件中。 

  (8) MemoryAppender 将日志存到内存缓冲区。 

  (9) NetSendAppender 将日志输出到Windows Messenger service,这些日志信息将在用户终端的对话框中显示。

  (10) RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service。

  (11) RemotingAppender 通过.NET Remoting将日志写到远程接收端。

  (12) RollingFileAppender 将日志以回滚文件的形式写到文件中。 

  (13) SmtpAppender 将日志写到邮件中。

  (14) TraceAppender 将日志写到.NET trace 系统。

  (15) UdpAppender 将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

  Filter:

  Appender 是将日志以缺省值的方式输出,意思就是按照默认值的方式输出。而Filter 意思就是过滤器,使用Filter 可以将日志以不同格式来输出。

  Layout:

  这个用于控制日志输出显示格式。

  Object Render:

  用于按照用户自定义标准来输出日志。

  Log4net 结构图 (从其他地方截图过来)

  Log4net 的日志对象管理器LogManager:LogManager是用于来管理所有的Logger对象的,GetLogger() 可以用来查找已经存在的Logger对象,如果对象不存在它会自动创建一个Logger对象,并且管理它。

  四. Log4Net 日志级别

  Log4net 分为如下几个级别:

  FATAL  毁灭级别

  ERROR 错误级别

  WARN 警告级别

  INFO 消息级别

  DEBUG 调试级别

  这几种日志级别高低:FATAL> ERROR> WARN > INFO > DEBUG。

  只有日志输出级别大于或等于配置的级别才能输出日志信息。

  比如我的日志配置级别为INFO,那么只有log.Info(), log.Warn(), log.Error(), log.Fatal()才能输出日志信息,Debug方式就不能输出。

  Log4net中还有两种特殊的配置级别上海企业网站设计与制作: ALL - 允许所有的日志级别输出,OFF - 拒绝所有的日志级别输出。

  五. Log4Net 配置说明


<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<!--记录日志到数据库-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=GAS-HECHEN;initial catalog=dsc141051_db;integrated security=false;persist security info=True;User ID=sa;Password=000000" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>

<!--输入日志到控制台-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[时间]:%d%n[级别]:%p%n[内容]:%m%n%n"></conversionPattern>
</layout>
</appender>

<appender name="FileAppender" type="log4net.Appender.FileAppender">
<param name="file" value="D:\a.log"></param>
<param name="appendToFile" value="true"></param>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[时间]:%d%n[级别]:%p%n[内容]:%m%n%n"></conversionPattern>
</layout>
</appender>

<root>
<level value="INFO"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</root>
<logger name="MyLogger">
<level value="INFO"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
</logger>
</log4net>

  这个配置文件定义了三种不同的Appender,分别是ADO.NET 记录到数据,ConsoleAppender 从控制台输出, FileAppender 日志信息文件输出。

  然而Log4Net 的配置附着器远不止这些,这里上传一个比较全的附着器配置文件供大家参考 点击下载

  根据上面的日志配置文件仍然使用如下代码测试:

  这里需要注意,log4net.Config.XmlConfigurator.Configure();   这个相当于初始化Log4net, 如果是在Web程序中,我们可以将这句话添加到 Global.asax 文件的Application_Start(object sender, EventArgs e) 方法中,在程序启动的时候就初始化配置信息。

  上面的程序运行结果图,控制台输出结果为:

 

  信息记录到指定的磁盘文件中,记录的结果如下图:

  这里说明两个配置:

  这里的 root 和 logger 配置节点,root 就相当于默认的日志对象配置,而logger是指定特定的日志配置。他们可以共存。

  对于这两个节点下面都有 level 和 appender-ref 节点,分别用于指定日志的输出级别和引用哪些附着器。每个日志对象都可以使用多个appender,这里的配置同时使用文件输出和控制台输出。得到的结果就是上面两个结果图。

  下面的logger对象添加了AdoNetAppender附着器,当使用MyLogger日志对象的时候就会使用这三种不同的方式记录日志。

  上面的程序声明了两个日志对象 log 和 log1,log 是在初始化的时候存在的,它得到的是<logger name="MyLogger"> 这个日志对象,而log1 是 LogManager 中不存在的日志对象,这里它会重新创建一个并且由LogManager 管理,后面再次使用则使用这个已经存在的对象。 这里两个日志对象同时使用结果如下:

  现在我修改配置文件的日志文件输出级别:


<logger name="MyLogger">
<level value="WARN"></level>
<appender-ref ref="FileAppender"></appender-ref>
<appender-ref ref="ConsoleAppender"></appender-ref>
<appender-ref ref="AdoNetAppender"></appender-ref>
</ logger>

  运行得到的结果如图:

  显然MyLogger对象日志没有输出日志信息。

  六. Log4Net 参数说明 

  上面我们看到的配置文件中有类似 %m %n 等这样的符号,这些符号都是有特殊意义的。


%m[%message] : 输出的日志消息
%n : 换行
%d[%datetime] : 输出当前语句运行的时刻
%r : 输出程序从运行到执行到当前语句时消耗的毫秒数
%d : 当前语句所在的线程ID
%p : 日志的当前优先级别
%c :当前日志对象的名称
%L : 输出语句所在的行号
%F :输出语句所在的文件名
%-数字 :表示该项的最小长度,如果不够,则用空格填充

  七. 自定义轻量级日志系统

  具体参照文章:  ORM映射框架总结--日志处理

  这里不再过多的说明,示例下载

时间: 2024-10-02 08:29:26

Log4Net 全方“.NET技术”位跟踪程序运行的相关文章

【NIPS2017】大会议程最全盘点,7位重磅嘉宾报告,DeepMind、Facebook论文汇总

12月4日,也就是下周一,一年一度的NIPS就要正式召开了.这届NIPS从售票(提前2个月售完)到赞助(赞助商太多关闭赞助通道),屡屡创下新高.待到正式开幕,数千名研究人员和参会者"挤挤一堂",绝非夸张. 那么,作为新智元NIPS系列报道的第一篇,我们将在本文中做一个初步的全景式介绍,包括会议信息,比如大会的Chair.Tutorial和Workshop情况,大会亮点,比如受邀报告,以及DeepMind.Facebook这些顶级研究院的工作. 会议赞助:瞥见当前AI产业势力分布缩影 翻

2017“CCF科学技术奖”全公布,6位获奖人带来独家经验分享

本文讲的是2017"CCF科学技术奖"全公布,6位获奖人带来独家经验分享, 由中国计算机学会(CCF)主办,福州市人民政府.福州大学承办,福建师范大学.福建工程学院协办的2017中国计算机大会(CNCC2017)将于10.26-10.28日在福州·海峡国际会展中心举办.今年大会的主题是"人工智能改变世界(AI Changes the World)",届时将邀请十多位院士.300余位国内外计算机领域知名专家.著名国际国内IT企业家到会演讲. 会议包括14个特邀报告.2

Win7提示“英特尔(R)快速存储技术未在运行”怎么办?

  故障现象: 英特尔(R)RST 服务是英特尔快速存储服务,即 intel rapidst,该程序为配备 SATA 磁盘的台式机.移动电脑和服务器平台系统提供更高的性能和可靠性.当使用一个或多个 SATA 磁盘时,可因性能提高及耗电降低而获益.使用多个磁盘时,可增强对磁盘故障时数据丢失的保护,安装 Intel 快速存储服务前需要于 BIOS 中开启 AHCI 模式.很多计算机用户在开机后会发现 Intel(R) Rapid 状态为英特尔(R)RST 服务未在运行,右键选择打开英特尔快速存储技术

Win7桌面右下角提示“英特尔(R)快速存储技术未在运行”怎么办?

  故障现象: 英特尔(R)RST 服务是英特尔快速存储服务,即 intel rapidst,该程序为配备 SATA 磁盘的台式机.移动电脑和服务器平台系统提供更高的性能和可靠性.当使用一个或多个 SATA 磁盘时,可因性能提高及耗电降低而获益.使用多个磁盘时,可增强对磁盘故障时数据丢失的保护,安装 Intel 快速存储服务前需要于 BIOS 中开启 AHCI 模式.很多计算机用户在开机后会发现 Intel(R) Rapid 状态为英特尔(R)RST 服务未在运行,右键选择打开英特尔快速存储技术

64位系统运行nehe opengl

问题描述 64位系统运行nehe opengl 我按照网上下载的nehe sdk进行配置以后,运行以后不出现opengl的窗口. 但使用网上另外一段opengl代码就运行成功了,不知道是不是因为64位系统的问题,用的是systemwow64文件夹存放dll. 解决方案 #include "opengl.h" #include "view.h" using namespace NeHe; // the view class static View view; stat

系统异常运行停止-公司系统在我win7的32位系统运行,一登陆windows就提示程序运行停止

问题描述 公司系统在我win7的32位系统运行,一登陆windows就提示程序运行停止 公司系统在我win7的32位系统运行,一登陆windows就提示程序运行停止.可是在其他人的64位win7上面运行都没有问题.我看了下windows下的日志信息显示如下:Stack: at System.RuntimeMethodHandle._InvokeMethodFast(System.IRuntimeMethodInfo, System.Object, System.Object[], System.

十万火急 关于32位com组件在64位系统运行的问题

问题描述 十万火急 关于32位com组件在64位系统运行的问题 我用com组件实现的类似于WinRAR右键菜单的功能 编译了一个32位的版本,在64位的机器上,注册完了,右键菜单没效果 同样的代码编译成64位的版本,在64位的机器上,注册完了,可以看到预期的效果 现在的问题是:不编译成64位的版本,直接用32位的版本,在64位系统中运行.(领导是这么要求的) 有什么方法可以解决32位的com在64位系统中运行(能显示右键菜单) 用的VS2012编译器 C++语言 解决方案 这么做没有什么意义吧?

谁有64位系统运行32位天正建筑2013补丁

问题描述 谁有64位系统运行32位天正建筑2013补丁 解决方案 解决方案二: 解决方案三: 解决方案四: 解决方案五: 解决方案六: 解决方案七:http://download.csdn.net/detail/zhl0123321/6557089这里有,但是很恶心,要注册,还有赚积分.

百联全渠道电商研发中心总经理邱宇炜:百联全渠道之技术转型之路

上海,中国的经济.金融.贸易.航运中心,一直以变革.创新引领着中国企业的发展.在"互联网+"浪潮下,上海企业首当其冲,这座城市,一直用信息化手段推动着企业的高速发展.2016年10月28日,企业网D1net携手上海CIO联盟共同举办的CIO沙龙活动在上海盛大举行,来自各行业的CIO共聚一堂,共同探讨各行业在互联网+实践方面的信息化实践,涵盖大数据实践.互联网风控等领域. 以下为:百联全渠道电商研发中心总经理邱宇炜在上海CIO沙龙的演讲,题目是:<百联全渠道之技术转型之路>