我有一个配置文件如下:
<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 .
你知道我的代码有什么问题吗?我已经在这两天里苦苦挣扎了。
答案 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实例放入你的配置文件中:每个类对应一个你想要的登录。