2014-11-24 65 views
1

我最近一直在想,從設計的角度來看,Log()和Log(LogLevel)之間有什麼真正的區別嗎?從設計的角度來看,Log()和Log(LogLevel)之間有什麼區別嗎?

例如,在log4net中,ILog接口的設計如下。

// Design A 
public interface ILog 
{ 
    /* Log a message object */ 
    void Debug(object message); 
    void Info(object message); 
    void Warn(object message); 
    void Error(object message); 
    void Fatal(object message); 

    // ... ignore more members 
} 

但我認爲它相當於這樣設計的。

// Design B 
public enum LogLevel 
{ 
    Debug, 
    Info, 
    Warn, 
    Error, 
    Fatal 
} 

public interface ILog 
{ 
    /* Log a message object */ 
    void Log(LogLevel level, object message); 

    // ... ignore more members 
} 

那麼爲什麼log4net的不使用設計乙級?任何特定的原因?

我能想到的一個原因是設計A減少了調用者的代碼噪聲,以便每次指定類似LogLevel.Info的內容。

但是設計B也有一個好處,我們可以在一次調用中改變消息的嚴重性。例如logger.Log(some_bool_condition?LogLevel.Warning:LogLevel.Error)。但是,當然,我們可以創建一個類似於設計A的包裝。

回答

1

從技術上講,這兩種方法都可以從ILog訪問,因爲它源自ILoggerWrapper。從那裏,你可以得到一個ILogger,可以讓你直接調用的方法爲你所描述的方法B:

void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception); 
void Log(LoggingEvent logEvent); 

所以具有ILog主要是降低了代碼噪音,只是調用如預期幕後記錄:

// log4net.Core.LogImpl 
public virtual void Info(object message) 
{ 
    this.Logger.Log(LogImpl.ThisDeclaringType, this.m_levelInfo, message, null); 
} 

顯然是有一定空間不同的解釋在這裏,但這裏就是爲什麼我認爲這是最好有調試/信息/警告/錯誤/致命方法,而不是一個普通的日誌(水平)一個。通過強制你的代碼使用一種方法,庫在編寫時強制它聲明信息在你的應用程序範圍內有多重要。

如果您只能將級別推遲到某個更高級別,那麼您只會說「哦,讓調用者決定他們想從我的組件中聽到多少」。但他們無法知道某件事對你的組件是否重要。你的代碼決定了需要什麼信息;它的應用程序用戶不想聽到它,讓他通過配置沉默你的記錄器,但只有你的代碼知道缺席的SQL服務器是否是引起警報或只是一些小麻煩(從最近的開發,在數據庫服務器可以消失沒有問題,我的組件只要它曾經回答過一次)。

+0

謝謝@samy!通過調用者,我指的是如你所說的調用日誌功能的組件。所以從組件的角度來看,有沒有真正的區別?我覺得組件調用logger.Error(「something」)等同於logger.Log(LogLevel.Error,「something」),對吧? – Quaker 2014-11-25 06:54:12

+0

這就是代碼中發生的事情,但正如我在第二部分所說的那樣,當您調用Log.Error(...)時會做出有意識的決定;你說「這很重要」。 – samy 2014-11-25 07:46:31

+0

我明白了。謝謝@samy! – Quaker 2014-11-26 05:11:31

相關問題