如何追踪log4net问题

时间:2009-04-16 13:30:01

标签: .net logging log4net

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

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

6 个答案:

答案 0 :(得分:269)

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

<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

答案 1 :(得分:33)

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

来打开调试。
<log4net debug="true">

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

答案 2 :(得分:20)

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

log4net.Util.LogLog.InternalDebugging = true;

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

答案 3 :(得分:3)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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