这可能不是你所追求的,但我承担......
你可以换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或“上翻”。。失败(不知道最后一个是否有效)。
希望这会有所帮助。