4

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

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

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

现在,如果我以正常方式实例化 log4net 记录器类,如下所示:

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

然后这工作,并且日志记录正常工作。但是,我已将日志记录代码包装在 LogManager 类中,该类是单独的程序集(基础架构)的一部分,并在多个项目中重复使用。它有一个如下所示的 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 就可以正常工作。

4

2 回答 2

3

总结一下Bibhu所说的。这一切都与log4net.Config.XmlConfigurator.

必须在开始记录之前配置 log4net。因此,每当您使用 LogManager 类时,托管应用程序(Windows、Web)都必须配置日志记录。

要么,要么你需要在你的 LogManager 中做。

于 2011-06-22T11:14:05.883 回答
2

告诉应用程序使用外部配置文件配置 log4net。这真的有两个地方。首先是 global.asax,其次是 assemblyInfo.cs 文件。请注意,大多数情况下,您将从一个包含所有内联代码的 global.asax 文件开始。无论出于何种原因,我可以让它工作的唯一方法是打破 global.asax 以使用代码隐藏,然后 ass 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 密切关注配置文件的潜在变化。如果您只想在测试过程中将配置从日志记录更改为错误,这将很有帮助。

然后,开始记录。

于 2011-06-22T11:06:19.523 回答