• VeryCodes.Log让日志记录和读取变的更简单


    在.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!

    这个日志读取程序使用正则表达式进行匹配,可以完整的读取发生异常时的堆栈信息。

    如果你觉得还可以,赶紧来试用下吧。 点击这里下载类库

    欢迎就使用过程中的问题与我讨论。

    来源:http://blog.bossma.cn/csharp/verycodes_log_for_simple_log/

  • 相关阅读:
    【bzoj2882】工艺 后缀自动机+STL-map
    【bzoj3884】上帝与集合的正确用法 扩展欧拉定理
    【bzoj1475】方格取数 网络流最小割
    【bzoj4825】[Hnoi2017]单旋 线段树+STL-set
    【bzoj4448】[Scoi2015]情报传递 主席树
    【bzoj1803】Spoj1487 Query on a tree III DFS序+主席树
    【bzoj2127】happiness 网络流最小割
    【bzoj2431】[HAOI2009]逆序对数列 dp
    【bzoj4245】[ONTAK2015]OR-XOR 贪心
    【bzoj4066】简单题 KD-tree
  • 原文地址:https://www.cnblogs.com/bossma/p/2124631.html
Copyright © 2020-2023  润新知