3

我一直致力于让 log4net 在客户的演示程序中工作,以便他们可以将其与他们的代码库集成。我在执行http://www.codeproject.com/Articles/14819/How-to-use-log4net时发现了这篇文章,其中描述的步骤之一是

第 2 步:在您的 AssemblyInfo.cs 文件中添加以下行。

[assembly: log4net.Config.XmlConfigurator(ConfigFile="Web.config", Watch=true)]   //For log4net 1.2.10.0

一旦我将那行代码添加到我的 AssemblyInfo.cs 中,记录器就开始工作了。

我在这个地方做了一些谷歌搜索,试图理解为什么需要这条线,并且大多数文档和评论声称 AssemblyInfo 是用于可选配置信息的。我不明白为什么添加这一行会使我的程序正常工作;我的关键问题是——AssemblyInfo.cs 中的配置信息如何被拾取和使用(是否有一些文档清楚地描述了这一点)——log4net 如何“知道”从 AssemblyInfo.cs 中获取该信息?

我从AssemblyInfo.cs 中的 assembly 关键字的含义了解。是否允许在内部使用方法?这些是程序集的属性,而不是其背后的机制。

4

2 回答 2

1

不错的话题。正如你所问的,我无法提供链接,只有几点,调查结果。我的一些陈述可能是众所周知且显而易见的。我试图把它们放在一起,在一个地方。并给出如何触发 log4Net 设置的魔力的答案。

  • AssemblyInfo.cs 是一个“普通”文件,与任何其他 .cs 文件一样,包含例如 C#定义。在项目文件中,它被标记为“编译”。换句话说,这是按照惯例选择的位置,应该放置所有“程序集”属性。但是它们可以(但不应该)在任何地方(如果放置在任何项目编译文件中的特定命名空间声明之外)。
  • 如果标记为 [AttributeUsage(AttributeTargets.Assembly)] ,任何自定义属性,如 log4Net“ XmlConfiguratorAttribute ”都可以添加到程序集定义中。
  • 所有属性都只是一个元信息。换句话说,它们是可用的(用于反射),但没有隐式使用。默认不执行。
  • (某些属性,如 AssemblyVersion、AssemblyTitle 似乎已被执行,但编译器有意且显式地调用)

鉴于此,我们可以用属性做什么。我们的(自定义)代码允许使用反射来检查是否存在属性,主要是特定的已知类型(例如XmlConfiguratorAttribute)。如果存在这样的属性,我们可以“执行”它。例如。我正在使用具有“运行时”的 ASP.NET MVC,它允许 IFilter 类型的任何属性都将正确执行。它是 MVC 运行时,观察类和方法并显式执行这些属性。

在 AssemblyInfo.cs 中单独声明的属性声明是不够的。如上面声明 XmlConfiguration 的代码段。通常会有一些其他调用(在 ASP.NET 中可能在 Global.asax 中)构建 ILog

ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

好吧,在方法调用链的某个地方,Log4Net 内部将检查是否存在:

var attributes = Attribute.GetCustomAttributes(thisAssembly, typeof(XmlConfiguratorAttribute));

如果是(程序集有这样的属性) - log4Net 可以使用它,强制它完成它的工作(例如从 xml 配置自己)

于 2012-10-25T10:53:29.493 回答
0

Log4net 具有在调用程序集中查找程序集级XmlConfigurator属性的代码。

它读取它找到的属性的属性并适当地配置自己。

于 2012-10-25T03:03:32.693 回答