2010-10-05 21 views
5

如何將我的normal日誌記錄/審計與我的安全日誌記錄/審計分開? Windows事件日誌與應用程序事件和安全事件有所區別。自定義NLog LogLevels或每個類的多個記錄器?

如果我可以創建一個自定義日誌級別如LogLevel.AuditSuccess或LogLevel.AuditFailure,然後我可以設置我的配置文件規則等於這些並輸出這些事件。例如,

<logger name="*" levels="AuditSuccess,AuditFailure" writeTo="target1"/> 
<logger name="*" levels="DEBUG,INFO" writeTo="target1"/> 

然後,我可以只使用1臺,記錄一列中的「級別」,並能夠搜索和使用此列的信息我的數據進行排序。 (我不認爲我們可以創建自定義記錄等級。)

一個解決辦法,我拿出是使用2個伐木者每類 - 與每個記錄保存到不同的目標。但是,這看起來似乎過度殺傷,特別是如果我需要添加其他類似的目標類型。

<logger name="myNamespace.*" levels="INFO,ERROR" writeTo="target1"/> 
<logger name="mySecurityLogger" levels="INFO,ERROR" writeTo="target2"/> 

public class MyClass { 
    private static Logger _logger = LogManager.GetCurrentClassLogger(); 
    private statac Logger _loggerSecurity = LogManager.GetLogger("mySecurityLogger"); 
    ... 
} 

有了這個,我可以創建兩個數據庫的目標 - 每一個不同的表 - ,然後爲每一目的地目標1條規則。

有什麼建議嗎?

回答

6

這可能不是你所追求的,但我承擔......

你可以換NLOG,這樣你可以記錄與自己的「記錄儀」。看看Common.Logging for .NETSLF對於如何包裝NLOG例子(它們是完整日誌記錄的抽象,所以他們比你所追求的更復雜,但你可能會選擇一些好的想法)。另見here(或許應該看看這裏首先,如果你認爲你可能會感興趣的只是包裝或子類NLOG記錄器),用於如何正確地包(或子類)NLOG例子(注意,關鍵是要傳遞的類型,你的包裹/子類記錄器到NLog的記錄方法)。

所以,你可能有這樣的事情(略):

//Wrapped logger that you could create once in a class and use to log both 
//"normal" messages and "audit" messages. NLog log level is determined by the 
//logger configuration for the class. 
public class MyLogger 
{ 
    private Logger logger; //NLog logger 

    public MyLogger(string name) 
    { 
    logger = LogManager.GetLogger(name); 
    } 

    public void Info(string message) 
    { 
    if (!logger.IsInfoEnabled) return; 

    Write(LogLevel.Info, LogLevel.Info.ToString(), message); 
    } 

    public void AuditSuccess(string message) 
    { 
    if (!logger.IsInfoEnabled) return; 

    Write(LogLevel.Info, "AuditSuccess", message); 
    } 

    private void Write(LogLevel level, string customLevel, string message) 
    { 
    LogEventInfo le = new LogEventInfo(level, logger.Name, message); 
    le.Context["CustomLogLevel"] = customLevel; 
    logger.Log(typeof(MyLogger), le); 
    } 
} 

這將給相應的自定義級別您特定級別的日誌記錄方法。它還將使您能夠輸出包含「自定義級別」的自定義列(using the event-context layout renderer)。它不會讓您能夠打開或關閉「AuditSuccess」級別的日誌記錄功能。它仍然必須由內置的級別來控制。

或者,您可以在您的包裹類中的兩個記錄器,並使用一個內置的水平和其他自定義級別。您的包裝可能是這樣的:

//Wrapped logger that you could create once in a class and use to log both "normal" 
//and "audit" messages. NLog log level for each type of message is controllable 
//separately since the logger wrapper actually wraps two logger. 
public class MyLogger 
{ 
    private Logger logger; //NLog logger 
    private Logger auditLogger; 

    public MyLogger(string name) 
    { 
    logger = LogManager.GetLogger(name); 
    auditLogger = LogManager.GetLogger("AuditLogger"); 
    } 

    public void Info(string message) 
    { 
    if (!logger.IsInfoEnabled) return; 

    Write(logger, LogLevel.Info, LogLevel.Info.ToString(), messsage); 
    } 

    public void AuditSuccess(string message) 
    { 
    if (!auditLogger.IsInfoEnabled) return; 

    Write(auditLogger, LogLevel.Info, "AuditSuccess", message); 
    } 

    private void Write(Logger log, LogLevel level, string customLevel, string message) 
    { 
    LogEventInfo le = new LogEventInfo(level, log.Name, message); 
    le.Context["CustomLogLevel"] = customLevel; 
    log.Log(typeof(MyLogger), le); 
    } 
} 

你仍然會有上面列出的相同的限制,但你至少可以控制「審計/安全」,從「正常」的日誌記錄分開。

在這兩種情況下,你可以從所有記錄器的輸出發送到同一個數據庫,只是做你的「自定義級別」一欄,而不是「文化程度」一欄查詢。取決於你有多少安全/審計「類別」有,你甚至可能想使一個具體的層次,這樣你可以在NLOG配置文件中的記錄器層次的優勢:

安全 Security.Audit 安全。 Audit.Success Security.Audit.Failure 安全性。登錄 Security.Login.Success Security.Login.Failure 健康 Health.Heartbeat Health.Whatever

然後,你可以安全或Security.Audit或「上翻」。。失敗(不知道最後一個是否有效)。

希望這會有所幫助。

3

難道你不能在你的班級中使用兩個不同名稱的記錄器,輸出到同一個目標,並使用${logger} layout renderer作爲字段值嗎?老實說,如果這些事件在應用程序域中非常重要,那麼通過記錄框架記錄它們是錯誤的方法。也許它應該是應用程序中更明確的建模概念。當然,如果您需要將事件數據存儲在與其他日誌消息相同的位置,您可能沒有該選擇。

否則,我傾向於偏離自定義日誌記錄級別,因爲它們從來沒有真正證明值得添加它們的麻煩。