Juvy

I Believe Persistence.

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

       说到日志,大家都清楚,无非就是记录:谁,在什么时候,做了什么/发生了什么错误,是不是觉得很简单。这次我也来做一回轮子,一步步教你如何写自己的日志帮助类。

       在开始之前我们需要分析一下日志帮助类(这里主要指文本日志)有哪些地方需要注意的:

1)、日志帮助类是用静态类,还是用?

2)、日志发生者通过什么方式传入,参数,还是?

3)、日志通过什么方式写,同步还是异步?

4)、日志文件保存位置和文件大小控制。

5)、扩展问题。

 

暂时个人只找到这么多,望大家补充。

        下面我就来说自己在这些方面是如何处理的

一、日志帮助类是用静态类,还是用?

       我的选择是非静态类,即通过实例化的方式获取日志帮助类对象,然后调用方法写日志,具体代码为:

TextLogHelper LogHelper = new TextLogHelper();

LogHelper.WriteLog(......);

       为何要这样做呢?其实说起来,自己当初写的好多东西都是静态,如静态类,静态对象、静态方法等等,因为那玩意儿好使啊,写起来方便,调用更加方便,为何不用。但是在不断的码农生活中,自己慢慢觉得有时候静态的东西也并不好使,例如:

       1)、静态公共字段/属性:并发问题,因为调用方都可能会修改值。这里只是说可能存在这种情况;

       2)、公共方法:参数个数问题。因为是静态方法,所以方法内部所需要的信息,只能通过参数的形势传入;

       3)、静态字段、属性维护问题,因为静态的字段太多,太杂,维护起来自然增加了难度。

       4)、面向对象程序开发的一个核心就是多态,所以如果用静态类的话,就不可能实现多态了。

       至于其他的这里就不一一列举了。还有一点需要指出的是,上述几点只是想说静态类存在这些问题,但并非表示任何情况都不适合用静态类,如工具类,数据转换类等,就可以采用静态类方法实现。所以采用静态类与否,还得根据实际情况而定。

 

二、日志发生者通过什么方式传入,参数,还是?

三、日志通过什么方式写,同步还是异步? 

四、日志文件保存位置和文件大小控制。

五、扩展问题。

        二、三、四、五几点我就放在一块来讲述了。

        其实日志发生者存在两种情况:一种是固定的日志发生在,如系统日志,或者框架内部日志;另外一种就是用户日志,如Web应用程序中,不同的用户登录就会面临不同的日志发生发生着。

        先来给出SAS框架中的文本日志类的两个构造函数:

private TextLogHelper(string logSavePath, bool asynMechanismLog, int logFileSize){...}

public TextLogHelper(Func<ILogUser> getLogUserHandler, string logSavePath, bool asynMechanismLog, int logFileSize){...}

public TextLogHelper(ILogUser logUser, string logSavePath, string asynMechanismLog, string logFileSize){...}

       通过上面几个构造函数,你或许已经看出了上面端倪了:

       1)、日志文件保存路径、同步/异步方式保存日志内容、日志文件大小问题的控制,都是通过构造函数参数传入的.

       2)、日志用户采用ILogUser的方式,也是为了便于扩展。在扩展方面其实还有一个ILogHelper接口,而本文要将的TextLogHelper就是继承自ILogHelper接口。

       3)、日志发生着通过两种方式传入,第一种是委托方式,让调用方来决定日志发生者是谁;第二种是直接传递日志用户对象进去。

      下面给出ILogHelper接口的代码。

 

 1 namespace SAS.Interface
 2 {
 3     #region using
 4     using System;
 5     #endregion
 6     /// <summary>
 7     /// NameSpace :: SAS.Interface
 8     /// Creater :: Juvy[david.telvent@gmail.com]
 9     /// Create Time :: 2011-11-13 7:50:47
10     /// Function :: 日志帮助类基类
11     /// </summary>
12     public interface ILogHelper
13     {
14         /// <summary>
15         /// 当前日志帮助类所使用的日志用户
16         /// </summary>
17         Func<ILogUser> GetLogUserHandler { getset; }
18         /// <summary>
19         /// 写日志信息
20         /// </summary>
21         /// <param name="message">日志信息</param>
22         void WriteLog(string message);
23         /// <summary>
24         /// 写日志信息
25         /// </summary>
26         /// <param name="message">日志信息</param>
27         /// <param name="methodName">当前出错的方法名称</param>
28         void WriteLog(string message, string methodName);
29         /// <summary>
30         /// 写日志信息
31         /// </summary>
32         /// <param name="ex">异常</param>
33         void WriteLog(Exception ex);
34         /// <summary>
35         /// 写日志信息
36         /// </summary>
37         /// <param name="ex">异常</param>
38         /// <param name="message">日志信息</param>
39         void WriteLog(Exception ex, string message);
40         /// <summary>
41         /// 写日志信息
42         /// </summary>
43         /// <param name="ex">异常</param>
44         /// <param name="message">日志信息</param>
45         /// <param name="methodName">当前出错的方法名称</param>
46         void WriteLog(Exception ex, string message, string methodName);
47     }
48 }

       日志接口包含五个写日志的方法,一个获取日志用户的属性。实现起来应该很简单,所以至于如何实现,在这里就不多讲了,留待自我发挥。

       现在说说本日志帮助类的两点不足:

       1)、日志级别问题

       2)、日志类型问题

 

       好了,本片SAS框架之文本日志类就讲到这里了,欢迎大家斧正!

 

 

ASP.NET开发技术交流群: 67511751

另:本人想找一些志同道合的人,可以是跟我一起交流技术的,或者是给予鼓励和支持的,非诚勿扰,谢谢!

QQ:1054930154

posted on 2011-12-28 10:42  Juvy  阅读(2568)  评论(7编辑  收藏  举报
QQ:1054930154; Email:david.telvent@gmail.com; QQ群:67511751