启用日志记录到log4net中的两个不同位置

时间:2011-12-06 22:07:07

标签: c# logging log4net log4net-configuration

我是log4net的新手,我正在尝试维护一些使用它的遗留代码。我注意到有两个静态类告诉log4net登录到不同的位置是相互绊倒的。

每个类都有一个看起来像这样的静态构造函数

static Logger() {
    _Logger = new X.LoggingService.AppLogger(
                X.UtilityServer.Configuration.ConfigInfo.LoggerConfigFile);
}

除了配置值不同外;这两个静态类都在初始化相同的AppLogger辅助类。初始化的第二个类是覆盖第一个类的初始化。我想我已经把问题追到了这里:

private  ILog Log  {
    get {
        if (!_ConfiguratorSet) {
            _ConfiguratorSet = true;
            XmlConfigurator.Configure(new FileInfo(_ConfigFile)); //<--- STATIC
        }
        return _log; 
    }
}

由于我绝对不必支持线程安全性,我应该删除if语句吗?每次我需要记录某些内容时调用XmlConfigurator.Configure会非常昂贵吗?有没有更好的办法?此代码是使用log4net 1.2.10版本编写的。

1 个答案:

答案 0 :(得分:1)

理想情况下,将会发生的事情是:

  1. 配置log4net(在应用启动时执行一次 - 这非常慢)
  2. 使用依赖注入将ILog传递给类(更好)服务定位器(更糟糕)以在所需的类中获取ILog
  3. 一个配置可以为您提供多个记录器,而这些记录器又可以有多个可以记录到各种输出的appender(db,console,队列等)。这为您提供了一个由一个配置文件控制的灵活性。你可以有一个配置文件,其中包含两个不同名称的文件记录器,它们将使用两个不同的appender将数据输出到两个文件中。
  4. 代码

    private  ILog Log  {
        get {
            if (!_ConfiguratorSet) {
                _ConfiguratorSet = true;
                XmlConfigurator.Configure(new FileInfo(_ConfigFile)); //<--- STATIC
            }
            return _log;
        }
    }
    

    真是令人困惑和错误。你应该只在那里返回一个日志,所以根本没有 ifs 。这违反了单一责任原则,也可能是您看到错误的原因。