2011-05-18 96 views
4

我們使用Enterprise Library 4.1進行日誌記錄(和異常處理/加密)。企業庫日誌記錄 - 如何在運行時獲取配置的日誌記錄級別?

有誰知道在運行時確定配置的日誌記錄級別的好方法嗎?我寫了一個LogUtility類來進行記錄電話,和我叫它按照本例:

LogUtility.LogVerbose(
    string.Format("Processing event {0}", currentEvent.EventIDImported), 
    MethodBase.GetCurrentMethod().Name, 
    this.GetType().Name 
); 

據我所知,它不會真正得到記錄到文件,除非日誌記錄級別設置爲在我的情況下,在app.config中是適當的級別。但是我並不真正想要方法參數,即方法和類型名稱,並且在某些情況下記錄實際字符串,除非絕對必要,否則將被評估。

這似乎是一個有效的關注?我們的應用程序可以有數千萬次的迭代和記錄點。如果可能的話,我想根據配置的日誌級別設置一個標誌,並在上面進行方法調用之前檢查該標誌。

編輯 - 我想就上面的例子來說,我可以在每次調用時硬編碼方法和類型名稱。但是我仍然想知道是否有確定水平的方法。

+1

這的確是一個值得關注的問題。 – 2011-05-18 10:57:56

回答

2

我真的不希望的方法 參數,即方法和類型 名稱,在某些情況下,實際的 字符串被記錄,除非絕對必要,否則將被評估爲 。

基於上述我想你應該看看ShouldLog方法LogWriter。它可以讓你確定是否將基於當前配置記錄一個LogEntry,並且可以(希望)避免創建不需要的對象。

從企業庫4.1 Walkthrough: Checking Filter Status Before Constructing Log Messages借用代碼:

LogEntry logEntry = new LogEntry(); 
logEntry.Priority = 2; 
logEntry.Categories.Add("Trace"); 
logEntry.Categories.Add("UI Events"); 

if (Logger.ShouldLog(logEntry)) 
{ 
    // Perform operations (possibly expensive) to gather additional information 
    // for the event to be logged. 
} 
else 
{ 
    // Event will not be logged. Your application can avoid the performance 
    // penalty of collecting information for an event that will not be 
    // logged. 
} 

由於您使用的是自己LogUtility類,你可能會想創建LogUtility一個靜態屬性稱爲ShouldLogVerboseIsVerboseEnabled和財產的內部使用「正確」構造的LogEntry(用於您的應用程序)來確定是否將記錄消息。例如

if (LogUtility.IsVerboseEnabled) 
{ 
    LogUtility.LogVerbose(
     string.Format("Processing event {0}", currentEvent.EventIDImported), 
     MethodBase.GetCurrentMethod().Name, 
     this.GetType().Name 
    ); 
} 
+0

感謝您指點我正確的方向;這正是我所期待的。我打算把你所描述的創建一個靜態屬性,但不知道如何獲得布爾值 - 「ShouldLog」就是我所追求的。 – StephenH 2011-05-19 09:12:04

相關問題