2011-06-22 52 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中卻使其不堪一擊:) –