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

本文关键字:位置 记录 日志 两个 log4net 启用 | 更新日期: 2023-09-27 18:16:53

我是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编写的

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

理想情况是:

  1. 配置log4net(在应用程序启动时执行一次 -这是非常慢的)
  2. 使用依赖注入将ILog传递给类(较好)服务定位器(较差)以在所需的类
  3. 中获取ILog
  4. 一个配置可以为您提供多个记录器,这些记录器反过来可以有多个appender,可以记录到各种输出(db,控制台,队列等),这为您提供了一个配置文件管理的很大灵活性。你可以在一个配置文件中使用两个不同名称的文件记录器,它们将使用两个不同的appender来输出数据,嗯,到两个文件中。

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

是非常混乱和错误的。这里应该只返回一个日志,所以根本没有ifs

这是对单一责任原则的违背,也可能是你看到bug的原因。