log4net设置从外部配置文件无法正常工作

时间:2011-06-22 10:55:46

标签: c# asp.net logging log4net log4net-configuration

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

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

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

现在,如果我以这样的正常方式实例化log4net记录器类:

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工作正常。

2 个答案:

答案 0 :(得分:3)

总结Bibhu所说的话。它与log4net.Config.XmlConfigurator有关。

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

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

答案 1 :(得分:2)

告诉应用程序使用外部配置文件配置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密切关注配置文件是否存在潜在的变化。如果您希望仅在测试过程中将配置从记录外部更改为错误,这将非常有用。

然后,开始记录。