динамическое имя приложения log4net? - PullRequest
2 голосов
/ 13 апреля 2010

Допустим, у меня есть 3 приложения smtp в одном файле log4net с именами:

<appender name = "emailDevelopment".. />
<appender name = "emailBeta".. />
<appender name = "emailProduction".. />

Допустим, у меня есть 3 разных сервера (Dev, Beta, Production). В зависимости от сервера, я хочу запустить журнал. В случае сервера разработки будет запущен журнал из «emailDevelopment». У меня есть системная переменная на каждом сервере с именем «ApplicationEnvironment», значение которой - Разработка, Бета, Производство на основе имен серверов. Теперь я могу настроить root в log4net, чтобы он запускал электронную почту в зависимости от имени сервера.

<root>
      <priority value="ALL" />         
      <appender-ref ref="email<environment name from whose appender should be used>" />      
</root>

Ответы [ 2 ]

4 голосов
/ 23 июля 2010

Это не дает прямого ответа на ваш вопрос, но другой подход состоит в том, чтобы просто иметь несколько конфигурационных файлов log4net и вызвать XmlConfigurator.Configure() справа. Например, у вас может быть Logging.Development.Config, Logging.Beta.Config и т. Д.

Где-то в коде вы определяете «среду» и конфигурируете, используя нужный файл.

Я даже зашел так далеко, что создал несколько файлов конфигурации и извлек их различные части в один XML, представляющий «истинную» конфигурацию, а затем вызвал метод Configure() для этого. Например, Logging.Appenders.Config, который имеет все добавочные файлы, берет их все и объединяет их с одним из указанных выше конфигурационных файлов для конкретной среды; специфичные для среды просто ссылаются на то, что им нужно, а остальные фактически неактивны / не ссылаются на эту среду.

1 голос
/ 14 апреля 2010

Даже после написания единственного XSD-файла для конфигурации log4net Я до сих пор не знаю простого способа добиться этого.

Вы можете сделать что-то вроде:

log4net.GlobalContext.Properties["host"] = new ClassThatToStringsHost();

class ClassThatToStringsHost 
{ public override string ToString() { return "whatever"; } }

Теперь вы можете ссылаться на это значение в формате журнала следующим образом: "% property {host}"

Для выполнения фильтрации вам потребуется использовать конфигурацию фильтра в адаптере (ах):

<appender name="file" type="log4net.Appender.RollingFileAppender">
  <filter type="log4net.Filter.PropertyFilter">
    <Key value="host" />
    <StringToMatch value="whatever" />
  </filter>

  <!-- Anything not accepted by the above should be excluded -->
  <filter type="log4net.Filter.DenyAllFilter" />
</appender>

Там может быть даже встроенное свойство, которое вы можете использовать, и это должно работать. Смотрите также этот пост: http://geekswithblogs.net/rgupta/archive/2009/03/03/dynamic-log-filenames-with-log4net.aspx

Для себя, я и я ... Я бы подошел к этому по-другому. Я бы получил свой собственный SMTP-приложение из значения по умолчанию, а в методе ActivateOptions () я настроил бы значения в соответствии со средой. Это позволит вам использовать одного SMTP-приложения с согласованными правилами и в то же время предоставить три открытых свойства для каждого из адресов электронной почты, с которых вы хотите отправлять сообщения. Это не сложно, попробуйте!

...