从外部配置文件设置的log4net不起作用

我对log4net有一个奇怪的问题。

在ASP.NET应用程序中,我想在外部配置log4net,因此我有一个单独的log4net.config文件,我在属于我的Web应用程序的AssemblyInfo.cs文件中使用此行连接到我的Web应用程序:

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

现在,如果我以这样的常规方式实例化log4net logger类:

 public class MyClass { private static readonly ILog _logger = log4net.LogManager.GetLogger(typeof(MyClass)); .... 

然后这工作,并且日志记录正常工作。 但是,我将日志代码包装在LogManager类中,该类是单独程序集(Infrastructure)的一部分,并在多个项目中重用。 它有一个GetLogger,如下所示:

 public static class LogManager { public static ILog GetLogger() { var stack = new StackTrace(); var frame = stack.GetFrame(1); return new log4net.LogManager.GetLogger(frame.GetMethod().DeclaringType); } } 

所以我可以在我的asp.net代码中使用它:

 public class MyClass { private static readonly ILog _logger = LogManager.GetLogger(); .... 

但是……这不起作用! 没有生成日志记录它似乎没有正确地连接配置文件。 如果我将我的log4net配置直接放入web.config,那么这个LogManager工作正常。

总结一下比比所说的话。 它与log4net.Config.XmlConfigurator

必须在开始记录之前配置log4net。 因此,无论何时使用LogManager类,托管应用程序(windows,web)都必须配置日志记录。

或者您需要在LogManager中执行此操作。

告诉应用程序使用外部配置文件配置log4net。 这有两个地方。 首先是global.asax,第二个是assemblyInfo.cs文件。 请注意,大多数情况下,您将使用包含所有内联代码的global.asax文件开始。 无论出于何种原因,我能够使用它的唯一方法是将global.asax分解为使用代码隐藏然后使用assemblyInfo.cs文件。 所以最终看起来像这样。

 global.asax: <%@ Application Language="C#" Inherits="GlobalAsax" %> global.asax.cs (in your App_Code folder): using System; using System.Web; public class GlobalAsax : HttpApplication { // you may have lots of other code here void Application_Start(object sender, EventArgs e) { log4net.Config.XmlConfigurator.Configure(); } } 

现在您的应用程序调用了log4net的配置,您可以在程序集信息中设置一个属性,以便log4net知道在哪里查找配置文件。

 AssemblyInfo.cs (in your App_Code folder): [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 

watch标志告诉log4net密切关注配置文件是否有可能发生的变化。 如果您希望仅在测试过程中将配置从将日志记录更改为错误,这将非常有用。

然后,开始记录。