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

时间:2015-03-10 08:46:29

标签: c# nlog

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

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

这是正确的做法:

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

然后在NLog.config中我会在rules元素中跳过这个目标,对吗?


总结:我想定义多个数据库目标,如常规日志和专用日志,以便我需要将更多详细信息记录到不同的表中。我想默认使用通用日志,而特殊日志只用于需要这种特殊日志记录的函数,因为它们的业务逻辑。

2 个答案:

答案 0 :(得分:6)

您始终可以使用指定的目标名称创建另一个记录器实例。 有什么问题?

例如,我想将扩展日志记录到单独的文件中。比我去创造

    <rules>
<logger name="ExtendedLogging" minlevel="Trace" writeTo="extendedLogging"/>
    </rules>

    <targets>
     <target name="extendedLogging" >
      <target xsi:type="File" fileName="C:/Logs/ExtendedLog${shortdate}.log" createDirs="true" />
    </target>
    </targets>

然后转到您的代码并创建

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

我认为在配置文件中搜索某些内容并通过后门程序执行日志记录不是一个好主意。 明确地做出所有这些事情会更好。

答案 1 :(得分: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(_ => { })));

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