Почему назвали логгер в Log4Net?

Я изучал способы введения Log4Net ILog в классы с использованием Castle Windsor. В большинстве примеров я вижу, где Castle Windsor может предоставить "посредника", который обеспечивает внедрение свойства и вводит ILogger (не ILog). Я нашел только один пример, где используется инъекция в конструктор, а метод фасилитатора не используется (см. Инжекция зависимостей Касла Виндзора: используйте тип вызывающего в качестве параметра)

Во всех этих примерах кажется, что Log4Net хочет иметь именованный регистратор. Большинство примеров ссылаются на статический метод Log4Net LogManager.GetLogger(имя класса здесь). Это затрудняет определение зависимостей для CastleWindsor без использования рефлексии или метода фасилитатора (можно ли использовать метод фасилитатора с инъекцией ctor???). Когда я смотрю на вопрос Ильи Когана (URL выше...), я думаю, что не понимаю, зачем мне нужен или даже нужен именованный регистратор. Разве я не могу использовать регистратор с одинаковым именем везде?

Например, я не могу просто зарегистрировать регистратор с жестко закодированным именем XXX? (Кажется, он работает нормально, и, в конце концов, я просто хочу войти - мне все равно, какой регистратор зарегистрировал это...) Есть ли проблема с областью действия? Есть ли проблема утечки памяти? Почему регистратор не может быть одиночкой?

public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
                Component.For<log4net.ILog>().UsingFactoryMethod(() => log4net.LogManager.GetLogger("xxx"))
                );
        }

ОБНОВИТЬ:

После некоторых исследований можно использовать жестко именованный регистратор имен - например, XXX в моем примере выше, но если конфигурация регистратора выводит имя регистратора в файл журнала и если имя регистратора динамически присваивается тому же имени, что и метод или класс, вы автоматически получаете ссылку на то, откуда возникла регистрация. Контекст в файле журнала может быть очень полезным.

Если говорить конкретно о впрыске ctor, кажется, что есть 5 возможных вариантов...

  • Используйте синглтон и не используйте именованные регистраторы (таким образом, не сообщается в файле журнала)
  • Использовать отражение с инжекцией ctor (как видно из примера Ильи Когана)
  • Использовать инъекцию свойств (через посредников)
  • Используйте пост-острый AOP IL-инъекцию для регистрации
  • Используйте инъекцию CTOR (через посредников)

2 ответа

Решение

Рекомендуемый способ DI для Log4Net Log с использованием Castle Windsor - использовать Услуги. Один из них уже создан для Log4Net, и его использование продемонстрировано в этом руководстве.

Хорошие вопросы

Короче говоря, log4net хочет именованные регистраторы, потому что затем имена используются для фильтрации выходных данных журнала (подробности см. В документации log4net). Имя типа - это просто удобное соглашение, так как оно предоставляет вам дополнительный контекст и в сочетании с правильным использованием пространств имен позволяет вам делать такие вещи, как, например, "записывать все сообщения NHibernate в отдельный файл".

Именно поэтому обычно, если вы не используете контейнер для этого, у вас есть одно свойство / поле статического регистратора в ваших классах.

ILogger вы имеете в виду абстракцию в Castle над журналированием, одна из которых может быть для log4net.

В то время как LoggingFacility обеспечивает готовую поддержку для обеспечения зависимости от ILogger это никоим образом не заставляет вас делать это.

Ваш ILog регистрация должна быть переписана следующим образом (я пишу это по памяти, поэтому детали могут немного отличаться):

Component.For<log4net.ILog>()
    .UsingFactoryMethod((k, c) => log4net.LogManager.GetLogger(c.RequestedType))
    .LifestyleTransient()

c.RequestedType даст вам тип, для которого вы удовлетворяете зависимость, и сделав ее переходной, позволит избежать проблемы, связанной с тем, что все типы будут повторно использовать единственный экземпляр регистратора, названного в честь того, каким был первый тип для запроса зависимости.

Другие вопросы по тегам