我一直都在使用log4net,但有一点我从未弄清楚的是如何判断内部发生了什么。例如,我的项目中有一个控制台appender和一个数据库appender。我对数据库和代码做了一些更改,现在数据库appender不再起作用了。我会弄清楚为什么最终,但如果我能看到log4net里面发生了什么,那将会有很大的帮助。
log4net是否会生成任何类型的输出,我可以查看以尝试确定问题的根源?
答案 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中,此错误可能已修复。