没有插入log4net程序集语句的日志输出 - 为什么?

时间:2013-09-12 22:11:19

标签: c# log4net

在我的项目中,我有一个DLL引用,它在内部使用log4net。在我的Main课程中,我插入了以下两个语句:

using log4net;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]

我还准备了一个App.Conf文件。

仅使用上述内容,日志记录无法启动。但是当我另外添加声明

private static readonly ILog log = LogManager.GetLogger(typeof(Main));

到我的Main课程,日志记录开始,一切正常。

为什么我必须创建一个ILog对象才能启动日志记录?我的App.Conf文件的汇编语句不应该足够吗?

2 个答案:

答案 0 :(得分:1)

第一次LogManager.GetLogger运行时,它会尝试确定如何配置log4net。它通过在当前程序集中查找log4net属性来完成此操作。

如果你没有在程序集中创建一个记录器,那么第一次创建记录器将来自你引用的dll,因此log4net将在该dll中查找log4net属性,但是找不到它,因此您的配置将被忽略。

包括行

private static readonly ILog log = LogManager.GetLogger(typeof(Main));

在你的主应用程序中,然后这个方法从你的exe运行,log4net将在你的exe中查找属性,这次它找到属性,然后继续加载正确的配置。

据我了解,此配置仅在第一次调用GetLogger时发生,因此确保首先从主应用程序调用GetLogger非常重要。

答案 1 :(得分:0)

我几乎总是使用:

private static readonly NLog.Logger log = LogManager.GetCurrentClassLogger();

这样可以省去(typeof(Main))你可以将它剪切并粘贴到需要记录的任何文件中。

我很困惑你是如何在不创建“log”对象的情况下调用日志记录的。你想做什么?

我可能只是使用我上面给出的代码行。