Learning log4net 3rd
前面的介绍主要是分析了log4net的整体框架和基本配置信息,这篇文章将主要讲述如何在C#项目中搭建辅助类实现log功能。
适配器模式搭建log
适度的抽象总是可以带来额外的好处(单元测试等),所以这里将不使用static class helper的做法,而是使用接口的实现方式。首先来分析一下log4net的一些基本情况,log4net将日记分为Debug,Info,Warn,Error和Fatal五个等级,并提供了对应的调用方法,所以要做的一件事是定义log的抽象接口出来。
public interface ILog { void CreateLogger(string logName); void Debug(string message); void Info(string message); void Warn(string message); void Error(string message); void Fatal(string message); }
这个interface的定义非常简洁,除了基本的5个等级调用接口后,还有一个创建log的接口,因为有时需要根据不同情况使用不同的logger,例如有一个logger格式专门来记录exception和另外一个logger来记录用户登录信息,这里通过CreateLogger方法传入一个logger的名字就可以切换log的记录对象。log4net是一个第三方框架,将它转化为自己定义的接口ILog,可以用适配器模式,同时将这个类的后缀命名为Adapter。
public class Log4NetAdapter:ILog { private log4net.ILog _log; public Log4NetAdapter(string loggerName = "ROOT") { _log = LogManager.GetLogger(loggerName); } public void Debug(string message) { if (_log.IsDebugEnabled) { _log.Debug(message); } } public void Info(string message) { if (_log.IsInfoEnabled) { _log.Debug(message); } } public void Warn(string message) { if (_log.IsWarnEnabled) { _log.Warn(message); } } public void Error(string message) { if (_log.IsErrorEnabled) { _log.Error(message); } } public void Fatal(string message) { if (_log.IsFatalEnabled) { _log.Fatal(message); } } }
首先来看Log4NetAdapter的构造函数实现,_log = LogManager.GetLogger(loggerName),log4net获取log对象要通过静态方法GetLogger,这个构造函数的作用是创建基本的logger对象,"ROOT"字符串只是作为一个标识作用,GetLogger方法会根据"ROOT"去找对应的Logger,因为配置文件中没有一个logger命名为"ROOT",所以就返回Root节点的Logger(必须有定义ROOT节点才行),这里把"ROOT"换为其他字符串也可以,但为了起到提示作用,所以这里用"ROOT"表示。
接下来看一个log等级函数实现,每个log等级方法中在调用前都会判断该等级是否启用,这样就避免了在未启用的情况下使用对应的方法。
最后是CreateLogger方法,这里可以通过传入一个对应的logger字符串改变log对象,使用起来更为灵活,特别是和IOC框架配合使用的时候。
加载log4net配置
log4net还需要有一个加载的过程,通常情况下是放在项目的全局执行对象中在初始化的时候加载一次(ASP.NET是在Global.ascx的Application_Start静态方法中),这里将直接在Log4NetAdapter中新建一个static method。
public static void Register(FileInfo configFile = null) { if (configFile == null) { XmlConfigurator.Configure(); } else { XmlConfigurator.ConfigureAndWatch(configFile); } }
Register方法提供了一个可选参数configFile,默认为null。当为null的时候,将执行XmlConfigurator.Configure()方法,这个方法将在应用程序中查找".config"后缀的配置文件,并同时查找配置文件中的log4net节点,从而完成配置信息的加载。当然,log4net支持另外一种独立配置文件的方式,我们可以将这个configFile文件作为参数传入,这时候将执行XmlConfigurator.ConfigureAndWatch(configFile)方法,这个方法将去查找configFile,并查找配置文件log4net节点。这个方法多了一个Watch的描述,这是表示log4net将监控配置文件,当configFile被修改的时候,实现自动重新加载。

浙公网安备 33010602011771号