如何追踪log4net问题

Joh*_*ant 182 .net logging log4net

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

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

Dav*_*art 280

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

<configuration>
   <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
   </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

然后,要确定要在其中保存输出的文件,可以在同一.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>
Run Code Online (Sandbox Code Playgroud)

您可以在"如何启用log4net内部调试?"下找到更详细的说明.在log4net FAQ页面中.

  • 只需确保运行您的应用程序的进程具有您要创建日志文本文件的路径的权限(上例中的"C:\ tmp\log4net.txt") (8认同)
  • 只是一个笔记我找到了有趣的方式.确保`<configSections> </ configSections>`是`<configuration>`下的第一个条目.否则你最终会出错. (4认同)
  • 看起来内部调试没有时间戳 (2认同)
  • 我从`C:\ tmp\log4net.txt`更改为`C:\ log4net.txt`,然后它可以生成文本文件. (2认同)
  • 这不会显示日志文件中条目的时间。我已经尝试在 `add` 标签中设置属性 `traceOutputOptions="TimeStamp"` 和 `traceOutputOptions="DateTime"`,但它在日志文件内容中没有任何改变。有人知道如何设置 log4net 以显示跟踪日志文件中每行/条目的时间吗? (2认同)

Bol*_*olo 38

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

<log4net debug="true">
Run Code Online (Sandbox Code Playgroud)

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

  • 启用此标志后-您将能够在Visual Studio的“输出”窗口中从log4net查看诊断日志 (4认同)

JP *_*oto 22

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

log4net.Util.LogLog.InternalDebugging = true;
Run Code Online (Sandbox Code Playgroud)

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


K0D*_*0D4 6

确保入口点所在的根应用程序将某些内容记录到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());
Run Code Online (Sandbox Code Playgroud)

使用2.0.8时,我遇到了一个有趣的情况。我创建了一个库项目和一个测试exe项目,以演示其功能。库项目被设置为与exe项目一样使用Log4net。exe项目使用assemblyinfo属性注册了配置,但是我没有将日志记录输出到控制台或日志文件。当我打开log4net内部调试日志记录时,我收到了一些写入控制台的内部消息,但是仍然没有我的普通日志。没有错误被报告。当我将上述代码添加到程序中时,一切都开始工作。Log4net否则已正确设置。

  • 也救了我的:-) (2认同)