Динамическая установка свойства log4net с использованием common.logging - PullRequest
3 голосов
/ 22 января 2010

Кто-нибудь знает, есть ли в 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 на лету.

Ответы [ 3 ]

3 голосов
/ 20 сентября 2010

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

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

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

  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.

2 голосов
/ 05 июня 2014

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

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

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

0 голосов
/ 23 января 2010

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

...