在.NET程序开发领域,log4net和nlog是两个十分优秀的日志组件,并且被广泛使用。当然还有一些系统独立开发使用读写文本文件(或其它存储格式)的方式处理日志。所以.net的日志处理方式大体可以分为:log4net、nlog和系统自定义日志处理三种方式。VeryCodes.Log并没有提供新的日志处理方式,这个类库提供了对以上三种方式的集成,达到使日志处理更简单,更统一的目的。
一、程序结构
VeryCodes.Log定义了两个接口ILogWriter和ILogReader。ILogWriter用于记录日志;ILogReader用于读取日志。
图1:ILogWriter
如图1中所示,所有日志记录类都实现了ILogWriter,目前提供了NLogWriter、Log4netWriter和SimpleLogWriter三个日志记录类。
默认的情况下(没有提供相应组件的配置文件)日志都将被记录到文本文件。
图2:ILOgReader
本程序只实现了一个日志读取类,该类只可以读取记录到文本文件的日志。
二、日志记录
1、Log4net
使用log4net组件记录日志,首先定义自己的日志记录类,可以定义多个类,这里定义一个类MyLog。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; using VeryCodes.Log; /// <summary> ///MyLog 的摘要说明 /// </summary> public class MyLog : Log4netWriter { /// <summary> /// 调用静态方法或属性时创建实例 /// </summary> static MyLog() { string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; Instance = new MyLog("MyLog", new FileInfo(path + @"\logs\MyLog.xml"), true); } /// <summary> /// 使用指定的配置文件创建日志类的一个实例 /// </summary> private MyLog(string loggerName, FileInfo configFile, bool isWatch) : base(loggerName, configFile, isWatch) { } /// <summary> /// 获取日志类的实例 /// </summary> public static MyLog Instance { get; set; } }
这里使用了继承的方式,当然也可以初始化为一个静态实例。目前log4net必须提供自己的配置文件,今后可能实现零配置。
程序中记录日志:
MyLog.Instance.ToInfo("I am a infoer."); MyLog.Instance.ToError("I am an errorer!");
2、Nlog
使用Nlog组件记录日志,首先定义自己的日志记录类,可以定义多个类,这里定义一个类MyNLog。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using VeryCodes.Log; /// <summary> ///MyNLog 的摘要说明 /// </summary> public class MyNLog : NLogWriter { /// <summary> /// 调用静态方法或属性时创建实例 /// </summary> static MyNLog() { Instance = new MyNLog("MyNLog"); } /// <summary> /// 使用指定的配置文件创建日志类的一个实例 /// </summary> private MyNLog(string loggerName) : base(loggerName) { } /// <summary> /// 获取日志类的实例 /// </summary> public static MyNLog Instance { get; set; } }
这里使用了继承的方式,当然也可以初始化为一个静态实例。可以看到nlog已经实现了零配置,当然也可以在初始化的时候指定配置文件。
程序中记录日志:
MyNLog.Instance.ToDebug("Hello NLog Debug!"); MyNLog.Instance.ToInfo("Hello NLog Info!");
3、简单日志记录类:SimpleLogWriter
using System; using System.Collections.Generic; using System.Linq; using System.Web; using VeryCodes.Log; /// <summary> /// 使用SimpleFileLog的日志类 /// </summary> public class MySimpleFileLog { /// <summary> /// SimpleFileLog静态实例 /// </summary> public static readonly SimpleLogWriter Instance; /// <summary> /// 静态构造函数 /// </summary> static MySimpleFileLog() { string filePath = HttpContext.Current.Server.MapPath("~/logs"); string prefix = "MySFL"; string fileExt = ".log"; string timeFormat = "yyyy_MM_dd_HH"; LogLevel level = LogLevel.Debug; Instance = new SimpleLogWriter(filePath, prefix, fileExt, timeFormat, level); } /// <summary> /// 记录Debug日志 /// </summary> /// <param name="msg"></param> public static void ToDebug(object msg) { Instance.ToDebug(msg); } /// <summary> /// 记录Info日志 /// </summary> /// <param name="msg"></param> public static void ToInfo(object msg) { Instance.ToInfo(msg); } /// <summary> /// 记录Error日志 /// </summary> /// <param name="msg"></param> public static void ToError(object msg) { Instance.ToError(msg); } }
程序中记录日志:
MySimpleFileLog.ToDebug("I am a debuger!"); MySimpleFileLog.ToInfo("I am a infoer!"); MySimpleFileLog.ToError("I am a errorer!");
三、日志读取
CommonLogReader实现了读取文本日志的相关方法,支持按照日志级别和日志记录时间过滤日志数据。
string path = Server.MapPath("~/logs/MySFL_2011_07_22_09.log"); CommonLogReader reader = new CommonLogReader(); DateTime startTime = DateTime.Parse("2011-07-22 09:47:00"); DateTime endTime = DateTime.Parse("2011-07-22 09:47:59"); string result = reader.ReadFile(path, startTime, endTime);
日志中的记录需要以时间为开头,才能进行正确的解析。例如使用SimpleLogWriter记录的日志:
2011-07-20 16:21:09,911 [Debug] - 日志启动... 2011-07-20 16:21:09,929 [Debug] - I am a debuger! 2011-07-20 16:21:09,929 [Info] - I am a infoer! 2011-07-20 16:21:09,929 [Error] - I am a errorer! 2011-07-20 16:21:09,960 [Error] - I am a errorer! [Exception]System.DivideByZeroException:尝试除以零。 在 VeryCodes_Log_SimpleFileLog.Button1_Click(Object sender, EventArgs e) 位置 e:\Demo\VeryCodes Framework\Demo\VeryCodes.Log.Demo\VeryCodes_Log\SimpleFileLog.aspx.cs:行号 23 2011-07-20 16:21:09,429 [Info] - I am a infoer! 在 VeryCodes_Log_SimpleFileLog.Button1_Click(Object sender, EventArgs e) 位置 e:\Demo\VeryCodes Framework\Demo\VeryCodes.Log.Demo\VeryCodes_Log\SimpleFileLog.aspx.cs:行号 23 2011-07-20 16:21:10,929 [Info] - I am a infoer! 2011-07-20 16:21:39,929 [Info] - I am a infoer! 在 VeryCodes_Log_SimpleFileLog.Button1_Click(Object sender, EventArgs e) 位置 e:\Demo\VeryCodes Framework\Demo\VeryCodes.Log.Demo\VeryCodes_Log\SimpleFileLog.aspx.cs:行号 23 2011-07-20 16:21:09,929 [Error] - I am a errorer! 2011-07-20 16:21:19,929 [Info] - I am a infoer! 2011-07-20 16:21:29,929 [Error] - I am a errorer!
这个日志读取程序使用正则表达式进行匹配,可以完整的读取发生异常时的堆栈信息。
如果你觉得还可以,赶紧来试用下吧。 ?点击这里下载类库。
欢迎就使用过程中的问题与我讨论。
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论