0

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

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

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

仅使用上述内容,日志记录不会开始。但是当我另外添加声明时

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

对我的Main班级来说,日志记录开始并且一切正常。

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

4

2 回答 2

1

第一次LogManager.GetLogger运行时,它会尝试确定 log4net 的配置方式。它通过在当前程序集中查找 log4net 属性来做到这一点。

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

通过包含该行

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

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

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

于 2013-09-13T09:29:55.317 回答
0

我几乎总是使用:

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

这使您不必做 (typeof(Main)) 并且您可以将其剪切并粘贴到任何需要记录的文件中。

我对您如何在不创建“日志”对象的情况下尝试调用日志记录感到困惑。你想做什么?

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

于 2013-09-13T01:32:27.697 回答