【发布时间】:2010-10-19 20:37:25
【问题描述】:
我一直都在使用 log4net,但我从来没有弄清楚的一件事是如何判断内部发生了什么。例如,我的项目中有一个控制台附加程序和一个数据库附加程序。我对数据库和代码进行了一些更改,现在数据库附加程序不再工作了。我最终会弄清楚为什么,但如果我能看到 log4net 内部发生了什么,那将有很大帮助。
log4net 是否会生成任何类型的输出,我可以查看这些输出来尝试确定问题的根源?
【问题讨论】:
我一直都在使用 log4net,但我从来没有弄清楚的一件事是如何判断内部发生了什么。例如,我的项目中有一个控制台附加程序和一个数据库附加程序。我对数据库和代码进行了一些更改,现在数据库附加程序不再工作了。我最终会弄清楚为什么,但如果我能看到 log4net 内部发生了什么,那将有很大帮助。
log4net 是否会生成任何类型的输出,我可以查看这些输出来尝试确定问题的根源?
【问题讨论】:
首先你必须在应用程序配置文件中设置这个值:
<configuration>
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
</configuration>
然后,要确定要在其中保存输出的文件,您可以在同一个 .config 文件中添加以下代码:
<configuration>
...
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\tmp\log4net.txt" />
</listeners>
</trace>
</system.diagnostics>
...
</configuration>
您可以在下面找到更详细的说明 '如何启用 log4net 内部调试? 在log4net FAQ page。
【讨论】:
C:\tmp\log4net.txt改成C:\log4net.txt,就可以生成文本文件了。
<configSections></configSections> 是<configuration> 下的第一个条目。否则你会报错。
add 标记中设置属性traceOutputOptions="TimeStamp" 和traceOutputOptions="DateTime",但它在日志文件内容中没有任何改变。有人知道如何设置 log4net 以显示跟踪日志文件中每一行/条目的时间吗?
如果您使用的是 log4net 配置文件,您还可以通过将顶部节点更改为:
<log4net debug="true">
一旦重新加载配置并假设您的跟踪侦听器设置正确,这将起作用。
【讨论】:
除了上面的答案,你可以使用这一行来实时查看日志,而不是 c:\tmp\log4net.txt 输出。
log4net.Util.LogLog.InternalDebugging = true;
例如,在控制台应用程序中,您可以添加它,然后实时观察输出。它非常适合在小型测试工具中调试 log4net,以查看您正在测试的 appender 发生了什么。
【讨论】:
确保您的入口点所在的根应用程序将某些内容记录到 log4net。给它以下之一:
private static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
logger.InfoFormat("{0} v.{1} started.", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString());
在 2.0.8 中,我遇到了一个有趣的情况。我创建了一个库项目和一个测试 exe 项目来演示它的功能。库项目被设置为使用 Log4net,就像 exe 项目一样。 exe 项目使用 assemblyinfo 属性来注册配置,但我没有得到控制台或日志文件的日志输出。当我打开 log4net 内部调试日志时,我收到了一些写入控制台的内部消息,但仍然没有我的正常日志。没有报告错误。当我将上面的代码添加到我的程序中时,这一切都开始了。否则 Log4net 设置正确。
【讨论】:
如果内部日志没有为您提供足够的信息,那么构建和调试source code 非常容易。如果您不想将其与您的开发项目混为一谈,请添加一个仅记录消息的简单控制台应用程序,将您的项目的 log4net.config 复制到此应用程序,然后调试相关类。
【讨论】:
在 log4net 2.0.8 中,似乎不可能在单独的 DLL 中使用 log4net 进行日志记录。如果我尝试这样做,结果会很奇怪:不再执行日志记录。并且使用调试选项初始化 log4net 没有显示错误。
就像 K0D4 所说的,你应该在你的主模块中引用 log4net,并且它应该在程序开始时调用一次,一切都很好。
在下一个版本的log4net中,这个bug可能会被修复。
【讨论】: