类项目未从Main项目加载log4net.config

时间:2009-08-30 11:15:56

标签: c# log4net

我在自己的类项目中有我的log4net Wrapper和log4net dll,我已将以下内容添加到类项目的assemblyinfo.cs中

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

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

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

      LogManager.GetLogger("DebugLogger").IsDebugEnabled;

因此,对我的LOGGING类的引用的主项目(webproject)返回TRUE,但是我从主项目调用的类项目返回false。

似乎该类项目没有读取log4net

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

构建时是否将Log4Net.config文件复制到目录中?您希望确保Log4Net.config在属性中始终为Copy。

我还会重新考虑在单独的文件中使用它。我赞成一个配置文件而不是几个。如您所见,很难处理不同的配置文件。

答案 1 :(得分:1)

如果我正确关注,您的设置就是这样:

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

  • 引用Logging Wrapper
  • 引用类库项目

记录包装器

  • 参考log4net
  • 包含程序集:XmlConfigAttribute

班级图书馆计划

  • 参考log4net

虽然你没有在你的log4net“包装器”类上发布任何细节,但我假设你的Web项目没有直接访问log4net,而是通过你的包装器。

根据my last answer,log4net正在解析配置并在您的包装器项目中构建日志存储库。虽然我很确定有only one repository per AppDomain,但听起来您的类库项目找不到默认存储库。由于它处于AppDomain级别,我怀疑它是否直接包装在你的包装器组件中。

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

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