现在的位置: 首页 > 综合 > 正文

LOG4NET图文教程

2013年10月22日 ⁄ 综合 ⁄ 共 6227字 ⁄ 字号 评论关闭

http://www.dobug.net/showtopic-76.html

 

一:简介

从操作系统到大多数的大型软件,都会有自己的程序运行时的日志跟踪API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而软件开发人员需要一套强大的日志系统来记录系统运行时的信息。日志记录往往是软件开发周期中的重要组成部分,它具有以下几个优点:
1.它可以为开发人员提供应用程序运行时的精确环境,便于发现程序BUG;
2.程序中加入了日志记录,程序运行过程中就无需人工干预;
3.日志信息文件可以输出到不同地方,为后来近一步研究扩展该程序提供详细资料。
而要达到这样的功能,在小型的程序中,我们可以自己开发日志记录追踪系统,只是简单实现txt之类的文件操作,便可把调用该方法的地方的日志记录下来。
Log4net 是基于.net开发的一款非常著名的记录日志开源组件。它最早是2001年7月由NeoWorks Limited启动的项目,基本的框架源于另外的一个 非常著名的姐妹组件-log4j。Log4net记录日志的功能非常强大。它可以将日志分不同的等级,比不同的样式,将日志输出到不同的媒介。

 

二:下载

我们可以到logging.apache.org/log4net/download_log4net.cgi网站上下载LOG4NET的源代码或者编译后的版本。可以在使用log4net的项目中添加log4net.dll引用便可使用,也可以将源代码添加到解决方案中以项目的形式存在,然后调用生成的dll文件。

 

三:Log4net组成

Log4net 有四种主要的组件,分别是Logger(记录器), Repository(库),
Appender
(附着器)以及 Layout(布局)

1.Logger(记录器)

1.1Logger接口

Logger是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。

Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(named
entity)
来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。log4net框架使用继承体系,继承体系类似于.NET中的名字空间。也就是说,如果有两个logger,分别被定义为a.b.ca.b,那么我们说a.ba.b.c的祖先,每一个logger都继承了祖先的属性

Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger,你必须首先实现这个接口

Log4net框架定义了一个叫做LogManager的类,用来管理所有的logger对象。它有一个GetLogger()静态方法,用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象,它也会为我们创建一个Logger对象。代码如下所示:log4net.ILog
log = log4net.LogManager.GetLogger("logger-name");通常来说,我们会以类(class)的类型(type)为参数来调用GetLogger(),以便跟踪我们正在进行日志记录的类。传递的类(class)的类型(type)可以用typeof(Classname)方法来获得,或者可以用如下的反射方法来获得:System.Reflection.MethodBase.GetCurrentMethod().DeclaringType

1.2日志级别

ILog接口中定义了五种不同的方法可以跟踪一个应用程序,事实上,这五种方法是运作在Logger对象设置的不同日志优先级别上。这几种不同的级别是作为常量定义在log4net.spi.Level类中。你可以在程序中使用任何一种方法。但是在最后的发布中你也许不想让所有的代码来浪费你的CPU周期,因此,框架提供了7种级别和相应的Boolean属性来控制日志记录的类型。优先级从高到低依次排列如下:FATAL
> ERROR > WARN > INFO > DEBUG

2.Repository(库)

Repository主要用于负责日志对象组织结构的维护。在log4net的以前版本中,框架仅支持分等级的组织结构(hierarchical organization)。这种等级结构本质上是库的一个实现,并且定义在log4net.Repository.Hierarchy
名字空间中。要实现一个Repository,需要实现log4net.Repository.ILoggerRepository
接口。但是通常并不是直接实现该接口,而是以log4net.Repository.LoggerRepositorySkeleton为基类继承。体系库
(hierarchical repository )则由log4net.Repository.Hierarchy.Hierarchy类实现。

如果你是个log4net框架的使用者,而非扩展者,那么你几乎不会在你的代码里用到Repository的类。相反的,你需要用到LogManager类来自动管理库和日志对象。

3.Appender(符着器)

一个Appender 对象缺省地将所有的日志事件传递到输出流。Appender的过滤器(Appender
Filters)
可以按照不同的标准过滤日志事件。在log4net.Filter的名字空间下已经有几个预定义的过滤器。使用这些过滤器,你可以按照日志级别范围过滤日志事件,或者按照某个特殊的字符串进行过滤。你可以在API的帮助文件中发现更多关于过滤器的信息。

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 LocalSyslogAppender
将日志写到local syslog service (仅用于UNIX环境下).
9 MemoryAppender
将日志存到内存缓冲区。

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

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

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

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

14 SmtpAppender
将日志写到邮件中。

15 TraceAppender
将日志写到.NET trace 系统。

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

4.Layout(布局)

Layout 组件用于向用户显示最后经过格式化的输出信息。输出信息可以以多种格式显示,主要依赖于我们采用的Layout组件类型。可以是线性的或一个XML文件。Layout组件和一个Appender组件一起工作。API帮助手册中有关于不同Layout组件的列表。一个Appender对象,只能对应一个Layout对象。要实现你自己的Layout类,你需要从log4net.Layout.LayoutSkeleton类继承,它实现了ILayout接口。

log4net.Layout.LayoutSkeleton类继承,它实现了ILayout接口。

%m[%message] : 输出的日志消息

%n : 换行

%d[%datetime] :输出当前语句运行的时刻

%r : 输出程序从运行到执行到当前语句时消耗的毫秒数

%d : 当前语句所在的线程ID

%p : 日志的当前优先级别

%c :当前日志对象的名称

%L : 输出语句所在的行号

%F :输出语句所在的文件名

%-数字:表示该项的最小长度,如果不够,则用空格填充

 

一. 配置

LOG4NET最主要是配置文件写好了,在程序只要简单的几行代码调用便可。

第一种:我们将配置信息写在程序的App.config或者Web.config

<configSections>

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>

</configSections>

AssemblyInfo.cs

的配置

//log4net配置文件路径

//[assembly: log4net.Config.XmlConfigurator(ConfigFile="Cinq.Log.config",Watch = true)]

//监视酣默认的配置文件,App.exe.config

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

 

在小型系统中我们也可以自己写一个简单的日志跟踪系统。

第一种:文档日志主要是利用.netFile类对txt文件的处理。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows.Forms;
  6. using System.Web;
  7. using System.IO;
  8. namespace Cinq.Log
  9. {
  10. /// <summary>
  11. /// 日志跟踪类
  12. /// </summary>
  13. public class MyLogs
  14. {
  15. #region 属性
  16. /// <summary>
  17. /// 日志文件目录
  18. /// </summary>
  19. private static readonly string errorDirectory = String.Format("{0}\\{1}", Application.StartupPath, "ErrorMsg");
  20. /// <summary>
  21. /// 日志文件路径--WinForm
  22. /// </summary>
  23. private static readonly string errorFilePath = String.Format("{0}\\{1:yyyyMMdd}.txt", errorDirectory, DateTime.Now);
  24. /// <summary>
  25. /// 日志文件路径--WebForm
  26. /// </summary>
  27. //private static readonly string errorFilePath = String.Format("{0}\\{1:yyyyMMdd}.txt", HttpContext.Current.Server.MapPath("~/ErrorMsg"), System.DateTime.Now);
  28. #endregion
  29. #region TXT记录日志
  30. /// <summary>
  31. /// 记录发生错误的信息
  32. /// </summary>
  33. /// <param name="errorMsg">错误的具体内容</param>
  34. public static void WriteExceptionInfo(string[] errorMsg)
  35. {
  36. StringBuilder sb = new StringBuilder();
  37. foreach (string e in errorMsg)
  38. {
  39. sb.Append(e + Environment.NewLine);
  40. }
  41. Error(sb.ToString());
  42. }
  43. /// <summary>
  44. /// 记录发生错误的信息
  45. /// </summary>
  46. /// <param name="errorMsg">错误的具体内容</param>
  47. public static void WriteExceptionInfo(string errorMsg)
  48. {
  49. Error(errorMsg + Environment.NewLine);
  50. }
  51. /// <summary>
  52. /// 记录发生错误的信息
  53. /// </summary>
  54. /// <param name="errorMsg">错误信息</param>
  55. private static void Error(string errorMsg)
  56. {
  57. try
  58. {
  59. //判断存放日志文件的目录是否存在
  60. if (!Directory.Exists(errorDirectory)) {
  61. Directory.CreateDirectory(errorDirectory);
  62. }
  63. //判断日志文件是否存在--这里是以当天的日志命名文件
  64. if (!File.Exists(errorFilePath))
  65. {
  66. FileStream fs = File.Create(errorFilePath);
  67. fs.Close();
  68. }
  69. StreamWriter sw = File.AppendText(errorFilePath);
  70. sw.WriteLine("发生错误时间:" + DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"));
  71. sw.WriteLine("错误内容:");
  72. sw.WriteLine("\t" + errorMsg);
  73. sw.WriteLine("————————————————————————————————————————————————");
  74. sw.WriteLine("");
  75. sw.Close();
  76. }
  77. catch (Exception ex)
  78. {
  79. throw (new Exception(ex.ToString()));
  80. }
  81. }
  82. #endregion
  83. }
  84. }

复制代码

在这里就是通过FileStream等操作一个文档文件只要调用Cinq.Log.MyLogs .WriteExceptionInfo("我的日志系统");便可把日志写入记事本。结果如图:

图片1.png(28.41 K)
2012-5-3 19:29:19

 

第二种:把日志写入系统日志中

 

#region 系统日志记录日志
/// <summary>
/// 消息事件源名称
/// </summary>
private static string EventSourceName = "Cinq";

public static void WriteSystemLog(string Msg) {
if (!EventLog.SourceExists(EventSourceName)) {
EventLog.CreateEventSource(EventSourceName, "Application");
}
EventLog.WriteEntry(EventSourceName, Msg, EventLogEntryType.Error,0,0);
}
#endregion

 

抱歉!评论已关闭.