Динамическая установка свойства log4net с помощью common.logging

Кто-нибудь знает, есть ли эквивалент в Common.Logging (для .Net) для установки свойств заводского адаптера log4net? Я добился большого успеха, просто используя log4net, выполнив:

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="logs\Log_%property{BrokerID}.txt"/>
    <appendToFile value="false"/>
    <rollingStyle value="Size"/>
    <maxSizeRollBackups value="-1"/>
    <maximumFileSize value="50GB"/>
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level %logger - %message%newline"/>
    </layout>
</appender>

и установить свойство как: log4net.GlobalContext.Properties["BrokerID"] = 10

В итоге файл выглядит так: Log_(null).txt при использовании common.logging для подключения log4net на лету.


person Kyle LeNeau    schedule 22.01.2010    source источник


Ответы (3)


См. мой ответ на предыдущий вопрос. Может поможет, может нет.

Подвести итоги:

  1. Common.Logging (NET) сообщает на своем веб-сайте, что поддержка "контекста" запланирована на "следующий" выпуск.

  2. На веб-сайте неясно, когда запланирован следующий выпуск (текущий выпуск – 2.0). На сайте написано "июнь". Текущая версия (2.0) была выпущена в апреле 2009 года. Последний раз веб-сайт обновлялся в мае 2009 года (возможно, для анонса версии 2.0)? Что означает слово «июнь»? июнь 2009? июнь 2010? Оба пришли и ушли.

  3. Учитывая, что поддержка «контекста» пока недоступна в Common.Logging, взгляните на реализацию «контекста» в проекте Castle (реализация log4net — здесь). Нетрудно перенести эту реализацию на Common.Logging. Риск заключается в том, что реализация контекста, которая в конечном итоге будет получена из Common.Logging, может не совпадать с реализацией Castle.

  4. Поддержка «контекста» Castle реализована на интерфейсе ILog/ILogger. Итак, вместо того, чтобы устанавливать контекст следующим образом:

Доступ к контексту через прямой log4net:

log4net.GlobalContext.Properties["BrokerID"] = 10;

Доступ к контексту через абстракцию ведения журнала:

ILog logger = Common.Logging.LogManager.GetCurrentClassLogger();
logger.GlobalContext.Properties["BrokerID"] = 10;

Это кажется довольно хорошим с точки зрения настройки контекста, когда у вас есть регистратор. Может быть, не так хорошо, если вы просто хотите установить контекст, не имея регистратора. Если Common.Logging.LogManager знает, какая абстракция является "активной" (а она должна быть, потому что абстракция устанавливается/получается через свойство LogManager.Adapter). Итак, возможно, «контекст» может быть доступен из интерфейса ILog, а также из интерфейса LogManager.Adapter.

person wageoghe    schedule 20.09.2010
comment
В 2.1 чего? Мой первый пример, log4net.GlobalContextProperties, по-видимому, должен быть log4net.GlobalContext.Properties (обратите внимание на точку перед свойствами). Также обратите внимание, что мой ответ относится к предыдущему сообщению, которое я сделал (см. ссылку в первом предложении моего ответа), в котором описывалось, как можно реализовать объекты контекста для Common.Logging, поскольку Common.Logging в то время не имел объекты контекста. В последнее время я не просматривал Common.Logging, поэтому не знаю, есть ли у него объекты контекста или нет, и если да, то каков синтаксис. - person wageoghe; 13.08.2012
comment
Ааа, ладно, я недостаточно внимательно, извините за то, что обвиняю вас ;), по теме: используя структуру внедрения зависимостей, должно быть достаточно легко выставить Wrapper для контекстных свойств log4net. Вы бы использовали код высокого уровня, который запускается для каждого веб-запроса (или другую отправную точку, если вы не создаете веб-приложение). В этой кодовой базе у вас, вероятно, в любом случае есть ссылка на log4net, потому что вам нужно настроить адаптер (либо с помощью файла .config, либо программно). - person Jaap; 15.08.2012

Я разветвил Common.Logging и добавил эту функциональность.

См. проект GitHub или NuGet.

Я также отправил запрос на включение для возврата изменений в основную ветку/проект.

person Danny Varod    schedule 05.06.2014

Я не думаю, что имеет смысл делать это через common.logging, потому что common.logging предназначен для того, чтобы обеспечить видимость фактической реализации ведения журнала, чтобы вы могли переключаться между log4net, NLog, EntLib и т. д. без изменения кода вашего приложения (а просто изменение конфигурация). Обратите внимание, что common.logging дает вам фасад над регистраторами (ILog), но не над приемниками журналирования (appenders на языке log4net). Таким образом, даже если бы вы могли настроить свойство BrokerID, неясно, как его можно использовать в других механизмах ведения журнала.

person Vinay Sajip    schedule 23.01.2010
comment
Если каждый присоединитель Common.Logging направляет это к регистратору позади него через ту же абстракцию, тогда это имеет смысл. - person Danny Varod; 05.06.2014