log4net не смотрит мой app.config - PullRequest
       47

log4net не смотрит мой app.config

12 голосов
/ 19 октября 2011

Я настроил свой log4net для отслеживания изменений, внесенных в файл app.config.

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

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

Есть ли способ указать log4net следить за изменениями в app.config? Как:

<appender name="FileAppender" type="log4net.Appender.FileAppender" >
    <watch value="true" />
</appender>

------------- РЕДАКТИРОВАТЬ -------------

Я пытался использовать отдельный файл конфигурации: log4net.config.
Это выглядит так:

<log4net>
  <appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="c:\log.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d [%t] %-5p %c (line %L) -- %m%n" />
    </layout>
  </appender>
  <root>
    <appender-ref ref="FileAppender" />
  </root>
</log4net>

В моей сборке Info.cs я написал следующее:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Класс, регистрирующий файл, выглядит следующим образом:

ILog myLogger = LogManager.GetLogger(typeof(Form1));
myLogger.Debug("test");

Это работает как старая версия. Записи в лог-файле сделаны, но когда я изменяю свой log4net.config во время выполнения, эти изменения не применяются .... «Watch = true» должно включить эту функцию, верно?

Ответы [ 3 ]

13 голосов
/ 19 октября 2011

HA !, Я только что столкнулся с той же проблемой, выполняя модульные тесты, которые требуют регистрации.
Добавление этой строки исправило это:

log4net.Config.XmlConfigurator.Configure();

My App.config:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="log.txt" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="100KB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="RollingFileAppender" />
    </root>
</log4net>

У меня тоже есть это:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
9 голосов
/ 26 марта 2014

Согласно документации log4net , функция Watch не работает для файлов конфигурации приложения (app.config, web.config):

Поскольку API-интерфейс System.Configuration не поддерживает перезагрузку файла конфигурации параметры конфигурации не могут быть просмотрены с помощью log4net.Config.XmlConfigurator.ConfigureAndWatch методы.

Таким образом, если вам нужно, чтобы конфигурация log4net была переконфигурируемой, вам нужно будет поместить ее в отдельный файл XML, и ваше приложение должно иметь достаточные разрешения для чтения файла:

Файл для чтения конфигурации можно указать с помощью любого из методов log4net.Config.XmlConfigurator, которые принимают объект System.IO.FileInfo. Поскольку файловая система может отслеживаться на предмет уведомлений об изменениях файлов, методы ConfigureAndWatch можно использовать для отслеживания изменений в файле конфигурации и автоматической перенастройки log4net.

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

Несмотря на то, что я ужасно опаздываю на вечеринку - вот что мне помогло: простой вызов log4net.LogManager.GetLogger("DUMMY"); в самом начале моей программы. Я поместил его в самую первую строку метода program.cs * Main () . Нет необходимости назначать регистратор любому объекту, просто вежливый запрос к log4net для чтения атрибутов сборки, как указано здесь .

Использование атрибутов может быть более понятным способом определения того, откуда будет загружена конфигурация приложения. Однако стоит отметить, что атрибуты являются чисто пассивными. Они только для информации. Поэтому, если вы используете атрибуты конфигурации, вы должны вызвать log4net, чтобы позволить ему читать атрибуты. Простой вызов LogManager.GetLogger вызовет чтение и обработку атрибутов в вызывающей сборке. Поэтому крайне важно сделать запись в журнале как можно раньше во время запуска приложения и, конечно, до того, как какие-либо внешние сборки были загружены и вызваны .

...