没有插入 log4net 汇编语句的日志输出 - 为什么

本文关键字:日志 输出 为什么 语句 插入 log4net 汇编 | 更新日期: 2023-09-27 18:31:11

在我的项目中,我有一个在内部使用 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文件的汇编语句不应该足够吗?

没有插入 log4net 汇编语句的日志输出 - 为什么

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

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

通过包含行

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

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

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

我几乎总是使用:

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

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

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

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