2009-08-30 53 views
2

我有我的log4net的包装和log4net的DLL在其自己的类加载的项目及log4net.config我已经添加了以下到类项目的AssemblyInfo.cs类项目不从主要项目

// log4net config file 
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 

所以我主项目有log4net.config文件,日志在我的主项目中工作。

我也有另一个类项目(与log4net无关),我的主要项目(日志正在工作)调用类项目。所以我输入新的类项目需要记录的东西,但IsDebugEnabled返回false ..这是行

 LogManager.GetLogger("DebugLogger").IsDebugEnabled; 

所以主体工程(webproject),其中有TRUE参考我的日志类的回报,而是一类项目我从我的主项目调用返回false。

看来,类项目不读取log4net

任何想法?

回答

0

如果我按照正确的,你的设置是这样的:

Web项目(web.config文件和log4net.config)

  • 引用记录包装
  • 引用类库项目

伐木包装

  • 参考log4net的
  • 包含装配:XmlConfigAttribute

类库项目

  • 参考log4net的

虽然你没有张贴在你的log4net的 “包装” 类中的任何细节,我假设你的Web Project不是直接访问log4net,而是通过你的包装器。

根据my last answer,log4net正在解析config并在您的wrapper项目中构建日志存储库。虽然我相当确定有only one repository per AppDomain,这听起来像你的类库项目没有找到默认的存储库。由于它在AppDomain级别,所以我怀疑它直接对包装器组件是独占的。

相反,这听起来像是一个计时问题。如果你先调用包装器然后再调用你的类库,会发生什么?我怀疑你会发现,如果你首先调用你的类库项目,你将不会得到一个记录器。但是,如果第一次日志记录调用是针对包装的,则任何后续的记录器请求都应该起作用。这是因为wrapper项目包含配置设置信息,并且第一次调用将为AppDomain配置日志记录存储库。

虽然我不是包装log4net的巨大粉丝,但可以通过在应用程序启动逻辑中强制对包装器进行调用,或者让您的类库项目使用包装器来解决此问题。请记住,如果使用包装器概念,您的类库将无法利用所有内置功能的log4net(如IsDebugEnabled),您将不得不通过包装器解决这些设置。

+0

感谢布赖恩,是的,我发现你的其他答案非常有帮助..我使用ThreadContext与类包装..所以我的代码是登录它出现,但它是相同的threadcontext - 如果这是有道理的..因此我需要调查 – 2009-09-04 14:14:31

1

建筑时是否将Log4Net.config文件复制到目录?您要确保Log4Net.config始终在属性中复制。

我也会重新考虑把它放在单独的文件中。我喜欢一个配置文件而不是几个。正如你所看到的,很难处理不同的配置文件。

+0

yes是的,我自成立以来它不是一个问题与log4net ..我使用ThreadContext与类包装..所以我的代码是登录它出现,但它是相同的threadcontext - 如果这有什么意义...因此我需要调查 – 2009-09-04 14:13:50