我的配置文件中有3个appender用于创建3种不同类型的日志。我通过设置全局上下文属性在3个appender中的每个中使用动态命名文件。在某些情况下,我需要为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>
在VB.NET代码中,我将文件名设置为:
log4net.GlobalContext.Properties("applog") = "file1.log"
Dim logobj as log4net.Ilog = LogManager.GetLogger("Logger1")
logobj.debug("test")
在这种情况下,它会创建“file1.log”以及另一个名为“null”的空文件。仅当我在运行时设置任一appenders文件名时才会发生这种情况。 任何帮助赞赏。
答案 0 :(得分:6)
据我所知,日志文件是在配置log4net时创建的。这意味着您需要先确保设置属性,然后再配置log4net。
e.g。
log4net.GlobalContext.Properties["applog"] = "file1.log"
log4net.Config.XmlConfigurator.Configure();
答案 1 :(得分: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")
答案 2 :(得分: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>();