Dynamic 在RollingFileAppender中使用动态文件命名的log4net中的问题

Dynamic 在RollingFileAppender中使用动态文件命名的log4net中的问题,dynamic,null,log4net,filenames,rollingfileappender,Dynamic,Null,Log4net,Filenames,Rollingfileappender,我的配置文件中有3个appender,用于创建3种不同类型的日志。通过设置全局上下文属性,我在3个附录中的每个附录中使用文件的动态命名。在某些情况下,我只需要为1个appender动态设置日志文件名。 当我只为1个appender设置文件名时,它会创建另一个名为“null”的文件,除了动态设置名称的实际日志文件之外,没有任何数据。 我已经创建了配置文件,如图所示 <appender name="RollingFileAppenderV1" type="log4net.Appender.Ro

我的配置文件中有3个appender,用于创建3种不同类型的日志。通过设置全局上下文属性,我在3个附录中的每个附录中使用文件的动态命名。在某些情况下,我只需要为1个appender动态设置日志文件名。
当我只为1个appender设置文件名时,它会创建另一个名为“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> 
在这种情况下,它会创建“file1.log”和另一个名为“null”的空文件。只有在运行时设置任何一个附加器文件名时,才会发生这种情况。
谢谢你的帮助

据我所知,日志文件是在配置log4net时创建的。这意味着您需要确保首先设置属性,然后配置log4net

e、 g


我也有同样的问题。调用XmlConfigurator.Configure()在运行程序集的文件夹中创建了两个文件-一个文件路径正确,另一个文件名为“null”

在第一次调用XmlConfigurator.Configure()之前,我将所有文件路径属性初始化为string.Empty,从而解决了这个问题

因此,在您的情况下,以下代码应该可以解决这个问题:

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")

log4net github页面上有关于这件事的讨论:

我不会对整个讨论进行解释,但在动态覆盖属性之前,建议的解决方法是指示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>();
//此行设置全局上下文中的属性
var dummy=Common.Logging.LogManager.GetLogger(“dummy”);
//现在将ILoggingFactoryAppender重置为null,以便需要重新配置log4net
Common.Logging.LogManager.Reset();
//现在,您可以覆盖全局上下文中的属性
dummy.GlobalVariablesContext.Set(“LogsDirectory”,“C:\\Logs”);
//访问LogManager.GetLogger()会触发log4net初始化,因为LogManager.Reset()将ILOGingFactoryAppender设置为NULL。
var logger=Common.Logging.LogManager.GetLogger();

如果我需要多次更改属性,该怎么办?Supose它以“file1.log”开头,在某些原因之后,我需要在全局上下文(而不是线程上下文)中将其更改为“anotherfile.log”。这不适用于我的情况(类似于OP)。我以前已经设置了全局上下文,但它不起作用。对不起,我错了。问题是我在汇编文件中已经有了另一个log4net配置,所以它被称为“before”,动态设置文件名。删除该选项解决了问题
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")
// 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>();