这可能不是你想要的,但请耐心听我说...
您可以包装NLog,使您可以使用自己的“记录器”进行日志记录。查看
.NET的Common.Logging或
SLF的示例,了解如何包装NLog(它们是完整的日志记录抽象,因此比您想要的更复杂,但您可能会获得一些好的想法)。另请参阅
此处(如果您认为您可能有兴趣简单地包装或子类化NLog Logger,则应首先查看此处)以了解正确包装(或子类化)NLog的示例(请注意,关键是将您包装/子类化的记录器类型传递给NLog的Log方法)。
因此,您可能会有类似以下的东西(缩写):
public class MyLogger
{
private Logger 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);
}
}
这将为您提供与您的自定义级别相对应的特定于级别的日志记录方法。 它还将使您能够输出包含您的“自定义级别”的自定义列(
使用事件上下文布局渲染器)。 它不会让您能够打开或关闭“AuditSuccess”级别日志记录。 它仍然必须由内置级别控制。
或者,您可以在封装类中包含两个记录器,并使用一个记录器用于内置级别,另一个记录器用于自定义级别。 您的包装器可能如下所示:
public class MyLogger
{
private Logger 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
Security.Audit
Security.Audit.Success
Security.Audit.Failure
Security.Login
Security.Login.Success
Security.Login.Failure
Health
Health.Heartbeat
Health.Whatever
然后,您可以“启用”Security或Security.Audit或
。 .Failure(不确定最后一个是否有效)。
希望这可以帮助您。