log4net中RollingFileAppender动态文件命名的问题

3

我在配置文件中有3个appender,用于创建3种不同类型的日志。我在每个appender中使用动态命名文件,通过设置全局上下文属性。在某些情况下,我仅需要为一个appender动态设置日志文件名。


当我仅为一个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> 

在VB.NET代码中,我将文件名设置为:
log4net.GlobalContext.Properties("applog") = "file1.log"  
Dim logobj as log4net.Ilog = LogManager.GetLogger("Logger1")   
logobj.debug("test") 

在这种情况下,它会创建“file1.log”,并且还会创建另一个名为“null”的空文件。只有在我在运行时设置任一附加器的文件名时才会发生这种情况。 感谢任何帮助。
3个回答

6
据我所知,日志文件是在配置log4net的时候创建的。这意味着您需要确保先设置属性,然后再配置log4net。
例如:
log4net.GlobalContext.Properties["applog"] = "file1.log"
log4net.Config.XmlConfigurator.Configure();

如果我需要多次更改属性怎么办?假设它以“file1.log”开头,由于某些原因,我需要在全局上下文(而不是线程上下文)将其更改为“anotherfile.log”。 - Luciano
这对我的情况不起作用(与原帖类似)。我已经在之前设置了全局上下文,但它并没有起作用。 - Hoàng Long
1
抱歉,我错了。问题在于我已经在程序集文件中有另一个log4net配置,因此在动态设置文件名之前就被调用了。删除它解决了这个问题。 - Hoàng Long

0

关于这个问题,在log4net的github页面上有讨论:

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

我曾经遇到过完全相同的问题。调用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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接