Проблемы в log4net с динамическим именованием файлов в RollingFileAppender

У меня есть 3 приложения в моем файле конфигурации для создания 3 разных типов журналов. Я использую динамическое именование файла в каждом из трех приложений, задавая свойства глобального контекста. В некоторых случаях мне нужно динамически установить имя файла журнала только для 1 приложения.
Когда я устанавливаю имя файла только для 1 приложения, он создает другой файл с именем "null" без данных в дополнение к фактический файл журнала, имя которого задано динамически. Я создал файл конфигурации, как показано.

<appender name="RollingFileAppenderV1" type="log4net.Appender.RollingFileAppender">   
<file type="log4net.Util.PatternString" value="Logs\%property{applog}" /> 
.
.
.
<appender name="RollingFileAppenderV2" type="log4net.Appender.RollingFileAppender"> 
<file type="log4net.Util.PatternString" value="Logs\%property{dblog}" />
.
.
.
<logger name="Logger1"> 
<level value="DEBUG" /> 
<appender-ref ref="RollingFileAppenderV1" /> 
</logger> 
<logger name="Logger2"> 
<level value="DEBUG" /> 
<appender-ref ref="RollingFileAppenderV2" /> 
</logger> 

В коде VB.NET я установил имя файла как:

log4net.GlobalContext.Properties("applog") = "file1.log"  
Dim logobj as log4net.Ilog = LogManager.GetLogger("Logger1")   
logobj.debug("test") 

В этом случае создается «file1.log», а также еще один пустой файл с именем «null». Это происходит только тогда, когда я устанавливаю имя файла любого из приложений во время выполнения. Любая помощь приветствуется.


person Ranjith    schedule 01.10.2010    source источник


Ответы (3)


Насколько мне известно, файл журнала создается в момент настройки log4net. Это означает, что вам необходимо сначала установить свойство, а потом настроить log4net.

e.g.

log4net.GlobalContext.Properties["applog"] = "file1.log"
log4net.Config.XmlConfigurator.Configure();
person Martin    schedule 06.10.2010
comment
Что делать, если мне нужно изменить свойство более одного раза? Предположим, он начинается с file1.log, и по некоторым причинам мне нужно изменить его на anotherfile.log в глобальном контексте (а не в контексте потока). - person Luciano; 20.03.2014
comment
В моем случае это не работает (аналогично OP). Я уже устанавливал глобальный контекст раньше, но он не работает. - person Hoàng Long; 16.10.2015
comment
Извините я не прав. Проблема в том, что у меня уже есть другая конфигурация log4net в файле сборки, поэтому она вызывается перед динамической установкой имени файла. Удаление этого решило проблему - person Hoàng Long; 16.10.2015

У меня была точно такая же проблема. Вызов XmlConfigurator.Configure () создал два файла - один с правильным путем к файлу, а другой с файлом с именем «null» в папке, из которой запускается сборка.

Я решил эту проблему, инициализировав все свойства пути к файлу в string.Empty перед первым вызовом XmlConfigurator.Configure ().

Итак, в вашем случае следующий код должен решить проблему:

log4net.GlobalContext.Properties("applog") = "file1.log"

' Set all of the other properties defined in the config file to String.Empty.
' By default, they are null and cause the issue.
log4net.GlobalContext.Properties("dblog") = String.Empty

log4net.Config.XmlConfigurator.Configure()

Dim logobj as log4net.Ilog = LogManager.GetLogger("Logger1")
logobj.debug("test")
person tetsushmz    schedule 01.05.2016

Именно об этом есть обсуждение на странице github log4net:

https://github.com/net-commons/common-logging/issues/81

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

// This line sets the properties in global context
var dummy = Common.Logging.LogManager.GetLogger("dummy");

// Now reset the ILoggingFactoryAppender to null so log4net needs to be re-configured
Common.Logging.LogManager.Reset(); 

// Now you can override properties in the global context
dummy.GlobalVariablesContext.Set("LogsDirectory", "C:\\Logs");

// Access to LogManager.GetLogger() triggers log4net initialization because the ILoggingFactoryAppender was set to NULL by LogManager.Reset().
var logger = Common.Logging.LogManager.GetLogger<MyLogger>();
person Ashby    schedule 25.10.2016