2011-06-22 51 views
4

我有一个奇怪的问题log4net。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 config直接放到web.config中,那么这个LogManager工作正常。

+1

当Log4Net首次在当前正在执行的程序集中被激发时,Log4Net是否扫描了程序集属性,因此,如果未在该程序集中定义该属性,那么该程序没有按预期设置? –

+0

是的,可能是 - 这可能与Eben的响应低于 –

回答

3

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

你有配置log4net才会启动日志记录。因此,无论何时使用LogManager类,托管应用程序(windows,web)必须配置日志记录。

要么你或你需要在你的LogManager中做到这一点。

+0

因此,如果使用LogManager类并且该类在另一个程序集中,那么我需要在我的global.asax.cs中手动调用XmlConfigurator.Configure()。这确实解决了它,但我没有得到它 - 为什么它会工作,如果我把我的_logger设置为* normal *的方式? –

+0

啊!根据chibacity的评论,我可能错过了---定义了[assembly:log4net.Config.XmlConfigurator ...]位在哪里?要点是托管应用程序*具有*来配置log4net(但是发生这种情况) –

+0

正确 - 看起来像问题!因为我将LogManager移动到另一个不具有程序集属性的程序集中,所以它不起作用!现在一切都说得通了。 –

2

通知应用程序使用外部配置文件来配置log4net。这真的有两个点。首先,global.asax和第二个assemblyInfo.cs文件。请注意,大多数情况下,您将首先使用内联全部代码的global.asax文件。无论出于何种原因,我唯一可以解决这个问题的方法就是打破global.asax以使用代码隐藏功能,然后使用assemblyInfo.cs文件。所以它最终看起来像这样。现在,你有你的应用程序中调用的log4net的配置

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的知道到哪里寻找配置文件中的程序集信息设置的属性。

AssemblyInfo.cs (in your App_Code folder): 

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

watch标志告诉log4net留意配置文件中的潜在变化。如果您只想在测试过程中将配置从日志记录更改为错误,这会很有帮助。

然后,开始记录。

+0

有关不太清楚为什么你给了我一个Udp配置使用,但我认为你的主要观点是.Configure()方法被称为..但我在这种置信的属性不需要这样做的印象? –

+0

@Matt Roberts - 看看这个问题,它可以帮助你。 HTTP://计算器。com/questions/1731513/best-practice-to-include-log4net-external-config-file-in-asp-net – Bibhu

+0

谢谢,但这是更好的做法。我所做的就是为我工作,我对此感到满意,但是将代码移入LogManager中却使其不堪一击:) –