2010-10-05 68 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作为字段值吗?老实说,如果这些事件在应用程序域中非常重要,那么通过记录框架记录它们是错误的方法。也许它应该是应用程序中更明确的建模概念。当然,如果您需要将事件数据存储在与其他日志消息相同的位置,您可能没有该选择。

否则,我倾向于偏离自定义日志记录级别,因为它们从来没有真正证明值得添加它们的麻烦。