【问题标题】:Issues in log4net with dynamic filenaming in RollingFileAppenderRollingFileAppender 中动态文件命名的 log4net 问题
【发布时间】:2016-10-25 08:28:17
【问题描述】:

我的配置文件中有 3 个附加程序,用于创建 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”的空文件。仅当我在运行时设置任一附加程序文件名时才会发生这种情况。 任何帮助表示赞赏。

【问题讨论】:

    标签: dynamic null log4net filenames rollingfileappender


    【解决方案1】:

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

    例如

    log4net.GlobalContext.Properties["applog"] = "file1.log"
    log4net.Config.XmlConfigurator.Configure();
    

    【讨论】:

    • 如果我需要多次更改属性怎么办?假设它以“file1.log”开头,由于某些原因,我需要在全局上下文(而不是线程上下文)将其更改为“anotherfile.log”。
    • 这不适用于我的情况(与 OP 类似)。我之前已经设置了全局上下文,但它不起作用。
    • 对不起,我错了。问题是我在程序集文件中已经有另一个 log4net 配置,所以它被称为“之前”动态设置文件名。删除解决了问题
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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>();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-25
        • 2011-07-17
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        相关资源
        最近更新 更多