如何追踪log4net问题


191

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

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

Answers:


293

首先,您必须在应用程序配置文件上设置此值:

<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页面中


10
只要确保您的应用程序在其下运行的进程具有您要创建日志记录文本文件的路径的权限(在上例中为“ C:\ tmp \ log4net.txt”)
NMrt,2015年

3
看起来内部调试没有时间戳
snit80

4
我从更改C:\tmp\log4net.txtC:\log4net.txt,然后可以生成文本文件。
Frank Myat Thu

6
只是一个便条,我发现了有趣的方式。确保<configSections></configSections>是下的第一个条目<configuration>。否则,您将最终出错。
尼克

2
这不会显示日志文件中条目的时间。我试过在标签中设置属性traceOutputOptions="TimeStamp"和标签,但日志文件内容未更改。有人知道如何设置log4net来显示跟踪日志文件中每行/每个条目的时间吗?traceOutputOptions="DateTime"add
Ulysses Alves

43

如果您使用的是log4net配置文件,则还可以通过将顶部节点更改为以下位置来打开调试:

<log4net debug="true">

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


6
启用此标志后-您将能够在Visual Studio的“输出”窗口中从log4net查看诊断日志
Naren

24

除了上述答案之外,您还可以使用此行实时查看日志,而不是c:\ tmp \ log4net.txt输出。

log4net.Util.LogLog.InternalDebugging = true;

例如,在控制台应用程序中,您可以添加它,然后实时查看输出。在小型测试工具中调试log4net很好,以查看所测试的附加程序发生了什么。


8

确保入口点所在的根应用程序将某些内容记录到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项目,以演示其功能。库项目被设置为与exe项目一样使用Log4net。exe项目使用assemblyinfo属性注册了配置,但是我没有将日志记录输出到控制台或日志文件。当我打开log4net内部调试日志记录时,我收到了一些写入控制台的内部消息,但是仍然没有我的普通日志。没有错误被报告。当我将上述代码添加到程序中时,一切都开始工作。Log4net否则已正确设置。


1
也节省了我的地雷:-)
哥斯塔

2

如果内部日志没有为您提供足够的信息,则很容易构建和调试源代码。如果您不想将其与开发项目混合使用,请添加一个简单的控制台应用程序,该控制台应用程序仅记录一条消息,将您项目的内容复制log4net.config到此应用程序中,然后调试相关的类。


2

在log4net 2.0.8中,似乎不可能在单独的DLL中使用log4net进行日志记录。如果我尝试这样做,结果将非常奇怪:不再执行日志记录。使用debug选项初始化log4net不会显示任何错误。

就像K0D4所说的那样,您应该在主模块中有一个对log4net的引用,并且应该在Programm启动时调用一次,一切都很好。

在下一版本的log4net中,此错误可能会得到修复。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.