如何追踪 log4net 问题

Posted

技术标签:

【中文标题】如何追踪 log4net 问题【英文标题】:How to track down log4net problems 【发布时间】:2010-10-19 20:37:25 【问题描述】:

我一直都在使用 log4net,但我从来没有弄清楚的一件事是如何判断内部发生了什么。例如,我的项目中有一个控制台附加程序和一个数据库附加程序。我对数据库和代码进行了一些更改,现在数据库附加程序不再工作了。我最终会弄清楚为什么,但如果我能看到 log4net 内部发生了什么,那将有很大帮助。

log4net 是否会生成任何类型的输出,我可以查看这些输出来尝试确定问题的根源?

【问题讨论】:

【参考方案1】:

首先你必须在应用程序配置文件中设置这个值:

<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:\tmp\log4net.txt改成C:\log4net.txt,就可以生成文本文件了。 只是一个笔记,我发现了有趣的方式。确保&lt;configSections&gt;&lt;/configSections&gt;&lt;configuration&gt; 下的第一个条目。否则你会报错。 这不会显示日志文件中条目的时间。我尝试在add 标记中设置属性traceOutputOptions="TimeStamp"traceOutputOptions="DateTime",但它在日志文件内容中没有任何改变。有人知道如何设置 log4net 以显示跟踪日志文件中每一行/条目的时间吗?【参考方案2】:

如果您使用的是 log4net 配置文件,您还可以通过将顶部节点更改为:

<log4net debug="true">

一旦重新加载配置并假设您的跟踪侦听器设置正确,这将起作用。

【讨论】:

启用此标志后,您将能够在 Visual Studio 的输出窗口中看到来自 log4net 的诊断日志【参考方案3】:

除了上面的答案,你可以使用这一行来实时查看日志,而不是 c:\tmp\log4net.txt 输出。

log4net.Util.LogLog.InternalDebugging = true;

例如,在控制台应用程序中,您可以添加它,然后实时观察输出。它非常适合在小型测试工具中调试 log4net,以查看您正在测试的 appender 发生了什么。

【讨论】:

【参考方案4】:

确保您的入口点所在的根应用程序将某些内容记录到 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 设置正确。

【讨论】:

也救了我的 :-) 呃,我遇到了同样的问题,似乎对首先使用 log4net 的程序集有一些要求 - 不确定它们到底是什么,可能是引用的库或配置中使用的东西(在我的情况下,我使用自定义附加程序,所以可能是 - 首先记录的程序集,还必须包含加载配置时所需的自定义代码)。 非常感谢,这对我也有帮助。这真是一个陷阱!【参考方案5】:

如果内部日志没有为您提供足够的信息,那么构建和调试source code 非常容易。如果您不想将其与您的开发项目混为一谈,请添加一个仅记录消息的简单控制台应用程序,将您的项目的 log4net.config 复制到此应用程序,然后调试相关类。

【讨论】:

【参考方案6】:

在 log4net 2.0.8 中,似乎不可能在单独的 DLL 中使用 log4net 进行日志记录。如果我尝试这样做,结果会很奇怪:不再执行日志记录。并且使用调试选项初始化 log4net 没有显示错误。

就像 K0D4 所说的,你应该在你的主模块中引用 log4net,并且它应该在程序开始时调用一次,一切都很好。

在下一个版本的log4net中,这个bug可能会被修复。

【讨论】:

以上是关于如何追踪 log4net 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Log4net 进行日志记录?

log4net:如何从 SQL Server 数据库中读取配置?

如何配置log4net以便log.IsDebugEnabled为true

将Log4Net添加到依赖注入后如何访问

如何在 log4net 中过滤自定义级别?

如何使用log4net