Log4net动态单独日志不起作用?

时间:2013-06-13 03:07:04

标签: logging dynamic 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 .")

生成了2个名为 consoleapplication1.testcls.log consoleapplication1.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 .

你知道我的代码有什么问题吗?我已经在这两天里苦苦挣扎了。

1 个答案:

答案 0 :(得分: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实例放入你的配置文件中:每个类对应一个你想要的登录。