日志与工厂模式(一)
关键字:日志 微软企业库 Log4net 工厂模式
日志是一个成熟系统必不可少的组成部分,而大部分常用的日志无非就是记录时间与发生的消息,日志可以输出到文件,WINDOWS事件以及控制台等等,先来看下面一个简单的日志组件。
首先定义一个 ISimpleLog 接口
public interface ISimpleLog {
void AddLog(string text);
void AddLog(string text, DateTime time);
}
接口包含一个方法名称的两个重载,然后在此接口上写一个实现类,如下:
public class SimpleTxtFileLog : ISimpleLog {
public void AddLog(string text) {
AddLog(text, DateTime.Now);
}
public void AddLog(string text, DateTime time) {
string msg = string.Format("时间:{0} 消息:{1}\r\n", time.ToString(), text);
string path = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Log.txt");
File.AppendAllText(path, msg);
}
}
SimpleTxtFileLog 类是将日志记录到文本文件中,文件的路径是当前运行程序的路径,文件名是Log.txt,每行输出格式形如:“时间:2009-6-11 18:18:34 消息:测试日志消息”。
再来实现一个控制台日志类 SimpleConsoleLog,将日志输出到控制台:
public class SimpleConsoleLog : ISimpleLog {
public void AddLog(string text) {
Console.WriteLine(text, DateTime.Now);
}
public void AddLog(string text, DateTime time) {
string msg = string.Format("时间:{0} 消息:{1}\r\n", time.ToString(), text);
Console.WriteLine(msg);
}
}
再来实现一个SimpleEventLog类,将日志输出到WINDOWS事件当中。
public class SimpleEventLog : ISimpleLog {
public void AddLog(string text) {
AddLog(text, DateTime.Now);
}
public void AddLog(string text, DateTime time) {
string Source = "SimpleEventLog";
string Log = "Application";
if (!EventLog.SourceExists(Source))
EventLog.CreateEventSource(Source, Log);
EventLog.WriteEntry(Source, text);
}
}
客户端使用代码:
ISimpleLog log = new SimpleEventLog();
log.AddLog("test");
ISimpleLog log2 = new SimpleConsoleLog();
log2.AddLog("test");
ISimpleLog log3 = new SimpleTxtFileLog();
log3.AddLog("test");
当然,现实中一般你就会记录到一个日志的位置。如果将来需要记录到数据库中的话,在扩展实现ISimpleLog接口即可。
现在你会发现,客户端的代码中仍然在使用 new 进行实例化日志类,而这块可能是会变化的,能不能通过修改配置文件并且不用修改客户端代码就可以替换呢,当然可以,用如下的代码就能做到这点:
public class SimpleLogWrapper {
public readonly string SimpleLogClassName = ConfigurationManager.AppSettings["SimpleLogClassName"];
public void AddLog(string text) {
ISimpleLog log = (ISimpleLog)Assembly.Load("IVSoft.Log.SimpleLog").CreateInstance(SimpleLogClassName);
log.AddLog(text);
}
public void AddLog(string Msg, DateTime time) {
ISimpleLog log = (ISimpleLog)Assembly.Load("IVSoft.Log.SimpleLog").CreateInstance(SimpleLogClassName);
log.AddLog(Msg, time);
}
}
需要在你的配置文件中增加一个配置:
<appSettings>
<add key="SimpleLogClassName" value="IVSoft.Log.SimpleTxtFileLog" />
</appSettings>
这样,客户端就可以使用SimpleLogWrapper 来使用了。
以上代码都比较简单,实现了一个日志记录的简单方法,但是突然有一天,你发现了微软企业库中的日志组件,觉着这个挺好用的,想在系统中使用它,结果呢?你不得不修改大量的代码,造成了高度的耦合,怎么办?下一篇我们就会使用工厂模式来实现一个比较通用的日志组件,包括企业库中的日志和Log4net组件。