2013-03-22 5 views
3

Я предпочитаю внешние файлы конфигурации для log4net, так как log4net может отслеживать эти файлы, и уровень может быть изменен без изменения файла app/web.config. Я немного борюсь за это в NServiceBus. Я использую Вот файл мой внешний конфигурационныйВнешний файл конфигурации NServiceBus и Log4Net

<?xml version="1.0" encoding="utf-8" ?> 
<log4net> 
    <appender name="RollingFile" type="log4net.Appender.FileAppender"> 
    <file value="C:\Logs\NServiceBusApplication.log" /> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%-5p %d{hh:mm:ss} %message%newline" /> 
    </layout> 
    </appender> 

    <root> 
    <level value="INFO" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 
</log4net> 

Самый простой способ сделать так, чтобы поместить атрибут в AssemblyInfo.cs

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

Это не работает в NServiceBus (я использую NServiceBus .Host.exe). Тогда я попытался назвать

SetLoggingLibrary.Log4Net(() => XmlConfigurator.Configure(log4netConfigUri)); 

перед тем Configure.With в EndpointConfig. С этим log4net читает файл конфигурации из правильного местоположения, он не следит за ним, поэтому, когда я меняю уровень журнала, он не отражается в приложении.

Далее я попытался с AppSettings

<appSettings> 
    <add key="log4net.Config" value="ApplicationName.log4net.xml"/> 
    <add key="log4net.Config.Watch" value="True"/> 
</appSettings> 

Опять же, log4net читает это, а затем читает ApplicationName.log4net.xml, он по-прежнему не смотрит на него.

Как настроить log4net в службе NServiceBus, который использует NServiceBus.Host.exe для

  1. Прочитайте форму конфигурационный файл внешнего файла конфигурации (т.е. log4net конфигурации не в app.config)
  2. Просмотрите внешний файл конфигурации, чтобы отразить любые изменения внешнего файла конфигурации.
+0

Убедитесь, что вы добавить IWantCustomLogging в конфигурацию вашей конечной точки? –

+0

Я верю, что сделал это во втором варианте, но я проверю еще раз и дам вам знать. –

+0

[сборка: log4net.Config.XmlConfigurator (ConfigFile = "ApplicationName.log4net.xml", Watch = true)] не влияет на IWantCustomLogging или без него. Журнал даже не направлен на нужный файл, поэтому этот параметр не влияет. –

ответ

6

Если вы используете атрибут сборки, используйте:

SetLoggingLibrary.Log4Net(); // no parameters 

Это должно работать:

SetLoggingLibrary.Log4Net(() => XmlConfigurator.ConfigureAndWatch(log4netConfigFileInfo)); 

Или это:

XmlConfigurator.ConfigureAndWatch(log4netConfigFileInfo) 
SetLoggingLibrary.Log4Net(); 
+0

Я не мог заставить атрибут сборки работать. Хозяин, похоже, не читает его вообще. Тем не менее, я смог использовать метод ConfigureAndWatch, и это работает. Благодарю. –

+0

Одна незначительная вещь, [ConfigureAndWatch] (http://logging.apache.org/log4net/release/sdk/log4net.Config.XmlConfigurator.ConfigureAndWatch_overloads.html) не принимает Uri. Он ожидает, что объект FileInfo будет передан. –

+0

Я не уверен на 100%, но это может быть из-за того, как конечная точка загружается в отдельный appdomain. Рад, что ConfigureAndWatch работал. –

5

NServiceBus> = 5.0 имеет отдельный файл nugetPackage для log4N и др: NServiceBus.Log4Net

Вместо вызова: SetLoggingLibrary.Log4Net(x => ...);

использовать следующие операторы:

log4net.Config.XmlConfigurator.Configure(); 
LogManager.Use<Log4NetFactory>(); 

Или обратитесь к этому образцу того, как программно настроить appenders: https://github.com/Particular/NServiceBus.Log4Net/blob/develop/src/Sample/LoggingConfig.cs

+0

Отлично, он работает –

Смежные вопросы