2009-04-16 77 views
140

我一直使用log4net,但有一件事我从来没有想过如何知道里面发生了什么。例如,我的项目中有一个控制台appender和一个数据库appender。我对数据库和代码进行了一些更改,现在数据库appender不再工作。我会弄清楚为什么最终,但如果我能看到log4net中发生了什么,它会有很大的帮助。如何追踪log4net问题

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

回答

224

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

<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

+7

只需确保您的应用程序正在运行的进程具有您想要创建日志文本文件的路径的权限(以上示例中为“C:\ tmp \ log4net.txt”) – Jtrx 2015-05-27 13:26:06

15

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

log4net.Util.LogLog.InternalDebugging = true; 

例如,在控制台应用程序中,您可以添加此选项,然后实时观看输出。在一个小测试工具中调试log4net以查看您正在测试的appender正在发生什么情况。

24

如果您使用的是log4net的配置文件,您还可以通过更改顶级节点打开调试有:一旦配置被重新装载

<log4net debug="true"> 

这将工作,假设您的跟踪监听器的设置是否正确。

0

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

0

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