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);
}
ILog

    这个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

  首先来看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);
    }
}
Static方法

  Register方法提供了一个可选参数configFile,默认为null。当为null的时候,将执行XmlConfigurator.Configure()方法,这个方法将在应用程序中查找".config"后缀的配置文件,并同时查找配置文件中的log4net节点,从而完成配置信息的加载。当然,log4net支持另外一种独立配置文件的方式,我们可以将这个configFile文件作为参数传入,这时候将执行XmlConfigurator.ConfigureAndWatch(configFile)方法,这个方法将去查找configFile,并查找配置文件log4net节点。这个方法多了一个Watch的描述,这是表示log4net将监控配置文件,当configFile被修改的时候,实现自动重新加载。

posted @ 2014-09-20 12:16  teroy  阅读(148)  评论(0)    收藏  举报