這可能不是你所追求的,但我承擔......
你可以換NLOG,這樣你可以記錄與自己的「記錄儀」。看看Common.Logging for .NET或SLF對於如何包裝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或「上翻」。。失敗(不知道最後一個是否有效)。
希望這會有所幫助。