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

16

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

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

这样做是否正确:

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

那么在 NLog.config 文件的规则元素中,我只需要跳过这个目标吗?


摘要:我想定义多个数据库目标,如一个通用日志和专门的日志,用于需要记录更多详细信息到不同表格的情况。默认情况下,我想使用通用日志,并且仅在需要出于业务逻辑的函数中使用特殊日志。


我只会使用配置设置而不是源代码。配置文件是目标和规则的混合体。您可以使用它来控制条目的写入位置。 - Fabrizio Accatino
同意@FabrizioAccatino的观点。XML配置可能一开始看起来很令人生畏,但我强烈推荐在NLog中使用它。它使整个过程更易于理解,并且您可以轻松地创建高度可配置的目标/规则。 - Flater
是的,我也更喜欢使用XML配置,但我只找到了这个,所以我想最好问一下是否可以,因为我感觉自己做错了什么事情。 - t3chb0t
2个回答

30

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

例如,我想将扩展日志记录到单独的文件中。 那么我就会去创建:

<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


问题在于我之前不知道这是可能的;-) 直到看到了你的回答。我从来没有运气发现我可以在配置中定义一个命名记录器。我不知道如果我指定一个现有的记录器名称给 GetLogger 方法,它会给我那个记录器。我想这就是我一直在寻找的东西。我会试一下的。 - t3chb0t
那么您可以将我的回复标记为答案!:) 它对我有效,很可能对您也有效))) 只需尝试一下。 - EngineerSpock
我一定会的……只是给我一些时间来测试一下;-] 我不喜欢没有标记的答案,所以我不会忘记你;-) - t3chb0t
你测试过这个解决方案吗? - EngineerSpock
我有两个目标,emailfile,但是当我这样做时,记录器仍然同时使用两个目标。 - Toolkit
1
@Toolkit 已更新答案,更详细地解释了如何使用 NLog LoggingRules。 - Rolf Kristensen

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

我不确定自己做了什么,但它起作用了。因为被接受的解决方案没有。

1
修复了被接受的答案的格式,这样人们就可以看到 NLog.config 的 XML 了。同时添加了 final="true",这样重定向到 extendedTarget 的日志就不会流向 defaultTarget - Rolf Kristensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接