Включить ведение журнала в двух разных местах в log4net - PullRequest
1 голос
/ 07 декабря 2011

Я новичок в 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 Ответ

1 голос
/ 07 декабря 2011

В идеале должно происходить следующее:

  1. Настроить log4net (сделать это один раз при запуске приложения - это очень медленно)
  2. Использовать зависимостьинъекция для передачи ILog классам (лучше) или сервисный локатор (хуже), чтобы получить ILog в необходимом классе
  3. Одна конфигурация может предоставить вам несколько регистраторов, которые, в свою очередь, могут иметьнесколько приложений, которые могут регистрировать различные выходы (дБ, консоль, очереди и т. д.). Это дает вам большую гибкость, управляемую одним файлом конфигурации.Вы можете иметь один файл конфигурации с двумя файловыми регистраторами с разными именами, которые будут использовать два разных приложения для вывода данных, ну, в общем, в два файла.

Код

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

- этодействительно сбивает с толку и неправильно.Вы должны только вернуть туда журнал, поэтому ifs вообще нет.Это нарушение принципа единой ответственности и, возможно, причина ошибки, которую вы видите.

...