在.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.Collections.Generic;
|
public class MyNLog :
NLogWriter |
Instance = new
MyNLog( "MyNLog" );
|
private MyNLog( string
loggerName) |
public static
MyNLog Instance
|
这里使用了继承的方式,当然也可以初始化为一个静态实例。可以看到nlog已经实现了零配置,当然也可以在初始化的时候指定配置文件。
程序中记录日志:
MyNLog.Instance.ToDebug( "Hello NLog Debug!" );
|
MyNLog.Instance.ToInfo( "Hello NLog Info!" ); |
3、简单日志记录类:SimpleLogWriter
using System.Collections.Generic;
|
public class MySimpleFileLog
|
public static
readonly SimpleLogWriter Instance;
|
string filePath =
HttpContext.Current.Server.MapPath( "~/logs" );
|
string timeFormat =
"yyyy_MM_dd_HH" ; |
LogLevel level = LogLevel.Debug;
|
Instance = new
SimpleLogWriter(filePath, prefix, fileExt,
timeFormat, level); |
///
<param name="msg"></param> |
public static
void ToDebug( object
msg) |
///
<param name="msg"></param> |
public static
void ToInfo( object
msg) |
///
<param name="msg"></param> |
public static
void ToError( object
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! |
这个日志读取程序使用正则表达式进行匹配,可以完整的读取发生异常时的堆栈信息。
如果你觉得还可以,赶紧来试用下吧。 点击这里下载类库。
欢迎就使用过程中的问题与我讨论。
来源:http://blog.bossma.cn/csharp/verycodes_log_for_simple_log/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战