在我的项目中,我有一个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
文件的汇编语句不应该足够吗?
答案 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”对象的情况下调用日志记录的。你想做什么?
我可能只是使用我上面给出的代码行。