如何追踪log4net问题

210
我经常使用log4net,但有一件事我从未弄清楚:如何查看内部运行情况。例如,我的项目里有控制台追加器和数据库追加器。我对数据库和代码进行了一些更改,现在数据库追加器不再起作用了。我最终会找到原因,但如果我能看到log4net内部的运行情况,就能帮助我很多了。
问:log4net是否生成任何输出,可以帮助我查看问题来源?
6个回答

317

首先,您需要在应用程序配置文件中设置此值:

<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 FAQ页面下找到更详细的解释,如何启用log4net内部调试。


10
请确保您的应用程序运行的进程具有在您想要创建日志文本文件的路径(如上面的示例中的“C:\ tmp \ log4net.txt”)的权限。 - NMrt
这是找出我的应用程序发生了什么的缺失提示,谢谢:D - NFRiaCowboy
3
似乎内部调试没有时间戳。 - snit80
4
我将路径从 C:\tmp\log4net.txt 改为 C:\log4net.txt 后,便成功生成了文本文件。 - Frank Myat Thu
7
注意,这是我通过有趣的方式发现的。确保<configSections></configSections><configuration>下的第一项。否则你会遇到错误。 - Nick
2
这不显示日志文件中条目的时间。我尝试在add标签中设置属性traceOutputOptions="TimeStamp"traceOutputOptions="DateTime", 但它并没有改变日志文件内容。有人知道如何设置log4net以显示跟踪日志文件中每行/条目的时间吗? - Ulysses Alves

50

如果您正在使用log4net配置文件,您也可以通过将顶级节点更改为以下内容来启用调试:

<log4net debug="true">
这将在重新加载配置并且您的跟踪侦听器设置正确时起作用。

这将在重新加载配置并且您的跟踪侦听器设置正确时起作用。


8
启用此标志后,您将能够在Visual Studio的输出窗口中看到来自log4net的诊断日志。 - Naren

26

除了上面的答案外,您还可以使用此行来实时查看日志,而不是输出到c:\tmp\log4net.txt文件中。

log4net.Util.LogLog.InternalDebugging = true;
例如,在控制台应用程序中,您可以添加此代码并实时查看输出。这对于在小型测试环境中调试log4net并查看您正在测试的appender发生了什么非常有用。

例如,在控制台应用程序中,您可以添加此代码并实时查看输出。这对于在小型测试环境中调试log4net并查看您正在测试的appender发生了什么非常有用。


10

确保你的入口点所在的根应用程序将日志记录到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设置正确。


2
我的也保存了 :-) - boggy
嗯,我也遇到了同样的问题,这似乎是关于使用log4net的汇编文件有一些要求——不确定它们具体是什么,可能是引用的库或在配置中使用的东西(在我的情况下,我使用自定义appender,所以很可能是那个——记录日志的程序集必须还包括加载配置时所需的自定义代码)。 - nazgul
非常感谢,这也帮助了我。这真是一个大坑! - EM0

2
在log4net 2.0.8中,似乎无法在单独的DLL中使用log4net进行日志记录。如果我尝试这样做,结果会非常奇怪:不再执行任何日志记录。并且使用调试选项初始化log4net时没有显示错误。
就像K0D4所说的那样,您应该在主模块中引用log4net,并且在程序启动时调用它一次,这样一切都很好。
在log4net的下一个版本中,这个bug可能会被修复。

2
如果内部日志没有给出足够的信息,那么构建和调试源代码是非常容易的。如果您不想将其与开发项目混淆,可以添加一个简单的控制台应用程序,只记录一条消息,将您项目的log4net.config复制到此应用程序中,并调试相关类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接