2009-12-21 130 views
0

我有一個框架庫,它可以做很多事情,包括日誌記錄。我們正在使用log4net進行日誌記錄。這個框架有靜態日誌類日誌管理,ILog的(記錄)和靜態方法的用於記錄信息,警告,調試等靜態實例log4net從Web應用程序登錄

靜態實例記錄儀越來越初始化這樣的:

public static class LogManager 
{   
    private static ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

    static ActivityLogManager() 
    { 

    } 

    public static void LogDebugy(string message, params object[] messageParameters) 
    { 
     // Log the message here 
    } 
} 

我有我自己的懷疑,如果這是正確的做法。我從here看到每個需要登錄的類都應聲明一個靜態實例ILog

另外我看到,我將不得不在我的框架項目中指定Log4net配置文件來記錄。以爲我讀here,配置將從執行的程序集中獲取,但我沒有看到它發生。

有沒有什麼辦法可以讓我的日誌記錄從我的框架類中完成,從我的Web應用程序(用於我的Web應用程序)或其他商業庫項目(用於我的業務類庫)中獲取配置?我也想添加一些自定義信息到我的日誌(如自定義業務對象ID等,應用程序池,ServerName,ClientHostName,ClientBrowser,ClientOS,客戶端用戶等)。可能嗎?

我正在使用AdoNetAppender。

Edit1:在我的assembly.cs中使用log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true)指向log4net配置文件。

Edit2:我的ILog Logger在我的框架LogManager類,因此只有一個實例爲我的應用程序生成。

+0

通常每個需要記錄東西的類都有自己的ILog實例,最好使用一個名稱來表示某種類型的hiearchy(命名空間+類型是常見的)。這允許人們過濾消息。 NHibernate這樣做可以讓你過濾掉某些子庫中的消息並轉儲所有的SQL查詢(通常在DEBUG中記錄)。 – Skurmedel 2009-12-21 18:44:57

回答

2

很多,但關於第一個問題,我用這種風格記錄程序問題:

private static ILog Log = LogManager.GetLogger(typeof(MyClass)); 

當然,你可以命名任何你喜歡的變量,而這是通過log4net的球隊,我認爲推薦,因爲這隻會導致您的類的每個實例只有一個ILog -instance。

這或多或少是你在做什麼,所以沒有什麼可擔心的。我不知道爲什麼你要通過執行方法很長的路要走。

我通常將配置放置在Web.config或App.config中。我無法推斷出你是否使用這些配置中的任何一個。如果你確實使用它,那很簡單。您只需爲log4net添加一個configuration部分並添加您需要的記錄器,appender和過濾器。

如果你想記錄的自定義數據,你可以把它添加到日誌消息,例如:

Log.WarnFormat(
    "Reactor malfunction, temperature {0} celsius." 
    + "Evacuate sector {1} immediately", 
    temp, 
    sector); 

或者如果需要存儲在某個對象的值,你可以做一個「渲染」了該類型將在對象作爲日誌消息傳遞時自定義打印,例如Log.Warn(myObjWithCustomFormatting)

對象渲染器必須從IObjectRenderer派生並將其註冊到配置中。

+0

我使用上面的但與System.Reflection.Methodbase.GetCurrentMethod()。DeclaringType()自動獲取類的類型。因爲這隻發生在構造函數被調用時相當便宜。 – GrayWizardx 2009-12-21 18:33:20

+0

我明白你的意思了。我想是一個偏好問題。 – Skurmedel 2009-12-21 18:37:43

+0

謝謝Skurmedal:我沒有使用web.config或app.config,使用assembly.cs(請參閱我的編輯)。另外我不是在談論格式,當我的意思是我想記錄自定義對象。我發現使用InfoFormat或WarnFormat將它記錄到我的DB列 - 消息中。我想要在數據庫中創建一個自定義列並存儲一些自定義信息 – ram 2009-12-21 18:44:55

1

我們在一些webapps中使用log4net,它們都很好。如果要從Web應用程序登錄到事件日誌,需要完成一些特殊設置,這取決於您使用的是哪個版本的Windows。簡而言之,它要求您授予正在運行的用戶寫入事件日誌的權限。在Win 7,2008等下,您必須授予整個分支機構的權限,其他所有權限都只是特定的應用程序日誌。

如果你想記錄到一個文件,只要確保該文件在apps目錄中,它應該沒問題。

如果您沒有在日誌框架中聲明日誌記錄的配置,但會延遲它,直到您的應用程序調用它爲止,默認情況下,這將在log4net配置節中發生。如果它先加載然後否,則將使用第一個加載版本,除非您在代碼中覆蓋它。