Проблемы в log4net с динамическим именованием файлов в RollingFileAppender - PullRequest
3 голосов
/ 01 октября 2010

В моем конфигурационном файле есть 3 приложения для создания журналов трех разных типов. Я использую динамическое именование файла в каждом из 3 приложений, устанавливая свойства глобального контекста. В некоторых случаях мне нужно динамически устанавливать имя файла журнала только для одного приложения.
Когда я устанавливаю имя файла только для одного приложения, он создает другой файл с именем «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». Это происходит только тогда, когда я задаю имя файла appenders во время выполнения. Любая помощь приветствуется.

Ответы [ 3 ]

6 голосов
/ 06 октября 2010

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

, например

log4net.GlobalContext.Properties["applog"] = "file1.log"
log4net.Config.XmlConfigurator.Configure();
0 голосов
/ 25 октября 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>();
0 голосов
/ 01 мая 2016

У меня была точно такая же проблема.Вызов 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")
...