如何将我的normal日志记录/审核与安全日志记录/审核分开?Windows事件日志与应用程序事件和安全事件区分开来.
如果我可以创建自定义LogLevel,例如LogLevel.AuditSuccess或LogLevel.AuditFailure,那么我可以将我的配置文件规则设置为等于这些并输出这些事件.例如,
<logger name="*" levels="AuditSuccess,AuditFailure" writeTo="target1"/>
<logger name="*" levels="DEBUG,INFO" writeTo="target1"/>
Run Code Online (Sandbox Code Playgroud)
然后我可以使用1个表,在列中记录"级别",并能够使用此列信息搜索和排序我的数据.(我认为我们不能创建自定义LogLevel.)
我提出的一个解决方法是每个类使用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");
...
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我可以创建两个数据库目标 - 每个目标都有一个不同的表 - 然后为每个目标目标创建1个规则.
有什么建议?
这可能不是你想要的,但请耐心等待......
您可以包装NLog,以便您可以使用自己的"记录器"进行记录.看一下.NET或SLF的Common.Logging,了解如何包装NLog的例子(它们是完整的日志记录抽象,因此它们比你所追求的更复杂,但你可能会发现一些好主意).另请参阅此处(如果您认为您可能只是想简单地包装或子类化NLog Logger,可能应该首先查看),以获取如何正确包装(或子类)NLog的示例(请注意,关键是要传递您的类型)包装/子类化记录器到NLog的Log方法).
所以,你可能有这样的东西(缩写):
//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);
}
}
Run Code Online (Sandbox Code Playgroud)
这将为您提供与您的自定义级别对应的特定于级别的日志记录方法.它还使您能够输出包含"自定义级别"的自定义列(使用事件上下文布局渲染器).它不会让您能够打开或关闭"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);
}
}
Run Code Online (Sandbox Code Playgroud)
您仍然具有与上面列出的相同的限制,但您至少可以将"审计/安全"日志记录与"正常"日志记录分开控制.
在任何一种情况下,您都可以将所有记录器的输出发送到同一个数据库,只需在"自定义级别"列而不是"级别"列上进行查询.根据您拥有的安全/审计"类别"数量,您甚至可能希望创建一个具体的层次结构,以便您可以利用NLog配置文件中的记录器层次结构:
Security Security.Audit Security.Audit.Success Security.Audit.Failure Security.Login Security.Login.Success Security.Login.Failure Health Health.Heartbeat Health.Whatever
然后你可以"打开"安全或安全.审计或.失败(不确定最后一个是否有效).
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
6214 次 |
| 最近记录: |