我一直在努力让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中获取该信息?
我从What does the assembly keyword mean in the AssemblyInfo.cs. Does it permit to use method inside?了解到这些是装配上的属性,而不是它背后的机制。
答案 0 :(得分:1)
好主题。我无法提供一个链接,正如您所要求的那样,只有几点,调查结果。我的一些陈述可能是众所周知的。我想把它们放在一起,放在一个地方。并给出答案如何触发log4Net设置的 magic 。
鉴于此,我们可以用属性做什么。我们的(自定义)代码允许使用反射来检查是否存在属性,主要是特定的已知类型(例如 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配置自己)
答案 1 :(得分:0)
Log4net具有在调用程序集中查找程序集级XmlConfigurator
属性的代码。
它读取它找到的属性的属性并适当地自行配置。