这是使用 NLog 记录到特定目标的正确方法吗?

本文关键字:目标 方法 NLog 记录 | 更新日期: 2024-11-07 02:02:43

我想将一些特殊事件记录到一个不同的表中,该表将包含比一般应用程序日志更多的数据。

如果我向NLog.config添加第二个数据库目标,如何在代码中使用它?

这样做是正确的吗:

NLog
    .LogManager
    .Configuration
    .AllTargets
    .Single(x => x.Name == "mySecondLogTable")
    .WriteAsyncLogEvent(...);

然后NLog.config我会跳过规则元素中的这个目标,对吧?


摘要:我想定义多个数据库目标,例如常规日志和专用日志,以便在需要将更多详细信息记录到不同表中的情况。我想默认使用常规日志,并且仅在由于其业务逻辑而需要这种特殊日志记录的函数中使用特殊日志。

这是使用 NLog 记录到特定目标的正确方法吗?

您始终可以创建另一个记录器实例,并使用 NLog 日志记录规则重定向到所需的目标。

例如,我想将扩展日志记录到一个单独的文件中。然后我去创建:

<nlog>
  <rules>
    <!--- Notice that final=true stops the logevents from also reaching defaultTarget -->
    <logger name="ExtendedLogging" minlevel="Trace" writeTo="extendedTarget" final="true" />
    <!--- Wildcard rule will capture all logevents not matching the "final" rule above -->
    <logger name="*" minlevel="Trace" writeTo="defaultTarget" />
  </rules>
    
  <targets>
    <target name="extendedTarget" xsi:type="File" fileName="ExtendedLog_${shortdate}.log" />
    <target name="defaultTarget" xsi:type="File" fileName="AppLog_${shortdate}.log" />
  </targets>
</nlog>

然后我去代码并创建

private readonly Logger logger = LogManager.GetLogger("ExtendedLogging");

我认为在配置文件中搜索某些内容并通过后门之类的东西执行日志记录不是一个好主意。最好明确地说明所有这些事情。

另请参阅:https://github.com/nlog/nlog/wiki/Configuration-file#rules

    var fileLogger = LogManager.Configuration.AllTargets.Single(x => x.Name == "file");
    fileLogger.WriteAsyncLogEvents(
                            new LogEventInfo(LogLevel.Info, null, error.ToString())
                            .WithContinuation(new NLog.Common.AsyncContinuation(_ => { })));

不确定我做了什么,但它有效。因为接受的解决方案没有