zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    查看mysql版本的四种方法及常用命令
    newInstance和new的区别(good)
    Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 前缀表达式
    Java实现 蓝桥杯 算法训练 前缀表达式
  • 原文地址:https://www.cnblogs.com/bossma/p/2124631.html
Copyright © 2011-2022 走看看