2013-06-13 24 views
0

我有一个配置文件如下:Log4net动态独立日志不起作用?

<configuration> 
<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />   
</configSections> 
<appSettings> 
    <add key="log4net.Config" value="log4net.config"/> 
</appSettings> 
<log4net> 
    <appender name="appenderA" type="log4net.Appender.RollingFileAppender"> 
     <file type="log4net.Util.PatternString" value="logs\\%property{LogName}" /> 
     <param name="AppendToFile" value="true" /> 
     <param name="RollingStyle" value="Composite" /> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
     <maxSizeRollBackups value="3" /> 
     <maximumFileSize value="5KB" />  
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d [%t] %-5p %c [%logger] = %m%n" /> 
     </layout> 
    </appender> 
    <logger name="ConsoleApplication1.testCls"> 
     <level value="INFO" />   
    </logger> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="appenderA" /> 
    </root> 
</log4net> 
</configuration> 

然后,我有一个函数会返回log4net.ILog

Public Function func(cls As Object) As log4net.ILog 
    Dim clsName As String = cls.ToString() 
    Dim rollAppen As New RollingFileAppender() 

    log4net.ThreadContext.Properties("LogName") = clsName.ToLower() & ".log" 
    log4net.Config.XmlConfigurator.Configure(New System.IO.FileInfo("Log4Net.config")) 
    Dim logg As ILog = LogManager.GetLogger(clsName) 
    Dim l As log4net.Repository.Hierarchy.Logger = DirectCast(logg.Logger, log4net.Repository.Hierarchy.Logger) 
    If l.Level Is Nothing Then 
     l.Level = l.Hierarchy.LevelMap("INFO") 
    End If 
    Return logg 
End Function 

现在我测试功能FUNC

Dim tCls As testCls = New testCls() 
    Dim cls As LogTest2 = New LogTest2() 
    Dim l4n As log4net.ILog 
    Dim l4n2 As log4net.ILog 

    l4n = cls.func(tCls.GetType().ToString()) 
    l4n2 = cls.func(cls.GetType().ToString()) 

    l4n.Debug("... Here is a debug log -2.") 
    l4n.Info("... and an Info log.") 
    l4n.Warn("... and a warning 1.") 
    l4n.Debug("... Here is a debug log -1.") 
    l4n.Warn("... and a warning 2.") 
    l4n.Warn("... and a warning 3.") 
    l4n2.Warn("l4n2 cls and a warning -1.") 
    l4n.Warn("... and a warning 4.") 
    l4n.Warn("... and a warning 5.") 
    Console.Write(" ... ... ... ") 
    l4n.Warn("... and a warning 6.") 
    l4n.Debug("... Here is a debug log 1.") 
    l4n.Warn("... and a warning 7.") 
    l4n2.Debug("l4n2 cls Here is a debug log.") 
    l4n2.Info("l4n2 cls and an Info log.") 
    l4n.Fatal("... and a fatal aaa.") 
    l4n2.Fatal("l4n2 and a fatal .") 
    l4n.Debug("... Here is a debug log 2.") 
    l4n.Warn("... and a warning 8.") 
    l4n.Error("... and an error.") 
    l4n.Debug("... Here is a debug log 3.") 
    l4n.Fatal("... and a fatal bbb.") 
    l4n.Debug("... Here is a debug log 4.") 
    l4n2.Debug("l4n2 cls Here is a debug log.") 
    l4n2.Info("l4n2 cls and an Info log.") 
    l4n2.Warn("l4n2 cls and a warning.") 
    l4n2.Error("l4n2 cls and an error.") 
    l4n2.Fatal("l4n2 cls and a fatal .") 

有两个日志文件,分别命名为co nsoleapplication1.testcls.logconsoleapplication1.logtest2.log生成。但是....

它只是consoleapplication1.logtest2.log有记录的内容和所有日志内容保存到consoleapplication1.logtest2.log。另一个日志consoleapplication1.testcls.log生成但没有内容。

consoleapplication1.testcls.log 
====no content==== 

consoleapplication1.logtest2.log 
2013-06-13 11:00:33,390 [11724] INFO = ... and an Info log. 
2013-06-13 11:00:36,408 [11724] WARN = ... and a warning 1. 
2013-06-13 11:00:36,411 [11724] WARN = ... and a warning 2. 
2013-06-13 11:00:36,413 [11724] WARN = ... and a warning 3. 
2013-06-13 11:00:36,414 [11724] WARN = l4n2 cls and a warning -1. 
2013-06-13 11:00:36,416 [11724] WARN = ... and a warning 4. 
2013-06-13 11:00:36,418 [11724] WARN = ... and a warning 5. 
2013-06-13 11:00:39,421 [11724] WARN = ... and a warning 6. 
2013-06-13 11:00:39,424 [11724] WARN = ... and a warning 7. 
2013-06-13 11:00:39,426 [11724] INFO = l4n2 cls and an Info log. 
2013-06-13 11:00:39,429 [11724] FATAL = ... and a fatal aaa. 
2013-06-13 11:00:39,431 [11724] FATAL = l4n2 and a fatal . 
2013-06-13 11:00:39,433 [11724] WARN = ... and a warning 8. 
2013-06-13 11:00:39,435 [11724] ERROR = ... and an error. 
2013-06-13 11:00:39,437 [11724] FATAL = ... and a fatal bbb. 
2013-06-13 11:00:39,439 [11724] INFO = l4n2 cls and an Info log. 
2013-06-13 11:00:39,441 [11724] WARN = l4n2 cls and a warning. 
2013-06-13 11:00:39,443 [11724] ERROR = l4n2 cls and an error. 
2013-06-13 11:00:39,444 [11724] FATAL = l4n2 cls and a fatal . 

你知道我的代码有什么问题吗?我已经为此挣扎了两天了。

回答

0

在配置文件中配置的appender是RollingLogFileAppender的唯一实例 - 只有两个对象指向它。因此,当您调用func()设置l4n2时,您将覆盖l4n的设置。为了证明这一理论,你应该能够切换线路:

l4n = cls.func(tCls.GetType().ToString()) 
l4n2 = cls.func(cls.GetType().ToString()) 

l4n2 = cls.func(cls.GetType().ToString()) 
l4n = cls.func(tCls.GetType().ToString()) 

和所有的日志输出应该进入consoleapplication1.testcls.log而非consoleapplication1.logtest2 .log所有的输出目前正在进行。

解决方法是通过编程生成每个类的新log4net的的appender(因为他们在回答this question做),或只是把RollingLogFileAppender的两个实例为您的配置文件:一个用于要记录每个类。

+0

感谢您的及时回复。在我使用你的方法之后**编程生成一个新的log4net appender **。日志内容成功在相关日志文件中生成。但是,当我在程序运行期间尝试更改配置文件(记录器级别)时,更改后无法保存日志内容。 –