说到日志,大家都清楚,无非就是记录:谁,在什么时候,做了什么/发生了什么错误,是不是觉得很简单。这次我也来做一回轮子,一步步教你如何写自己的日志帮助类。
在开始之前我们需要分析一下日志帮助类(这里主要指文本日志)有哪些地方需要注意的:
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接口的代码。
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 { get; set; }
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