gpt4 book ai didi

logging - 自定义 NLog LogLevels 还是每个类有多个记录器?

转载 作者:行者123 更新时间:2023-12-04 17:41:03 27 4
gpt4 key购买 nike

如何分离我的 normal从我的安全日志记录/审计中记录/审计? Windows 事件日志将这种区别与应用程序事件和安全事件区分开来。

如果我可以创建自定义 LogLevel,例如LogLevel.AuditSuccess 或 LogLevel.AuditFailure,然后我可以将我的配置文件规则设置为等于这些并输出这些事件。例如,

<logger name="*" levels="AuditSuccess,AuditFailure" writeTo="target1"/>
<logger name="*" levels="DEBUG,INFO" writeTo="target1"/>

然后我可以只使用 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");
...
}

有了这个,我可以创建两个数据库目标——每个都有一个不同的表——然后为每个目标目标创建 1 个规则。

有什么建议?

最佳答案

这可能不是你想要的,但请耐心等待......

您可以包装 NLog,以便您可以使用自己的“记录器”进行记录。看看Common.Logging for .NETSLF有关如何包装 NLog 的示例(它们是完整的日志抽象,因此它们比您所追求的更复杂,但您可能会找到一些好主意)。另见 here (如果您认为您可能对简单地包装或子类化 NLog Logger 感兴趣,则可能应该首先查看此处)有关如何正确包装(或子类化)NLog 的示例(注意,关键是传递包装/子类化的类型logger 到 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);
}
}

这将为您提供与您的自定义级别相对应的特定于级别的日志记录方法。它还将使您能够输出包含“自定义级别”( 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 或 Security.Audit 或 ..Failure (不确定最后一个是否有效)。

希望这可以帮助。

关于logging - 自定义 NLog LogLevels 还是每个类有多个记录器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3867650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com