如何追踪log4net问题

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

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

回答(6)

2 years ago

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

<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 page的'How do I enable log4net internal debugging?'下找到更详细的说明 .

2 years ago

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

<log4net debug="true">

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

2 years ago

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

log4net.Util.LogLog.InternalDebugging = true;

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

2 years ago

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

如果内部日志没有't give you enough information, it',则很容易构建和调试source code . 如果你没有't want to mix this up with your development project, add a simple console application which just logs a message, copy your project' s log4net.config 到这个应用程序,并调试有问题的类 .

2 years ago

在log4net 2.0.8中,似乎无法在单独的dll中使用log4net进行日志记录 . 如果我试过这个,结果很奇怪:不再执行日志记录了 . 使用调试选项初始化log4net不会显示错误 .

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

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