如何阻止NLog进行双重日志记录

时间:2017-03-03 22:56:03

标签: c# nlog

我正在为NLog编写WEB API调用,因此远程应用程序可以登录到我的日志记录表。

在我的控制器中,我(现在硬编码为完整性检查):

NLogger.LogError("Some Error Message", "An exception", 5, "A computer name"); 

然后我的静态LogError方法看起来像这样(我也尝试了LogEventInfo()):

public static void LogError(string msg, string ex, int appid, string machineName)
{
    LogEventInfo logEvent = new LogEventInfo(LogLevel.Error, "Api Logger", "Another test msg");
    logEvent.Properties["myMsg"] = msg;
    logEvent.Properties["myEx"] = ex;
    logEvent.Properties["myAppId"] = appid;
    logEvent.Properties["myMachineName"] = machineName;
    NLogManager.Instance.Log(logEvent);
}

最后,这是我的代码首次配置该规则(其他2个具有不同数据库目标的其他人):

private static void ConfigureApiLog()
{
    var dbApiErrorTarget = new DatabaseTarget
    {
        ConnectionString = ConnectionFactory.GetSqlConnection().ConnectionString,
        CommandText = "usp_LogError",
        CommandType = CommandType.StoredProcedure
    };

    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@level",
        new global::NLog.Layouts.SimpleLayout("${level}")));
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@logger",
        new global::NLog.Layouts.SimpleLayout("${logger}")));
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@message",
        new global::NLog.Layouts.SimpleLayout("${event-properties:item=myMsg}")));
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@exception",
        new global::NLog.Layouts.SimpleLayout("${event-properties:item=myEx}")));
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@AppId",
        new global::NLog.Layouts.SimpleLayout("${event-properties:item=myAppId}")));
    dbApiErrorTarget.Parameters.Add(new DatabaseParameterInfo("@MachineName",
        new global::NLog.Layouts.SimpleLayout("${event-properties:item=myMachineName}")));

    Config.AddTarget("database", dbApiErrorTarget);

    Config.LoggingRules.Add(new LoggingRule("*", LogLevel.Error, LogLevel.Fatal, dbApiErrorTarget));
}

我希望每个日志调用1 log对记录器实例,但我得到两个,我不确定原因:

   Id   Date    Level   Logger  Message Exception   AppId   MachineName
1   2017-03-03 22:43:20.557 Error   Api Logger  Another test msg        0   mylocalmachine
2   2017-03-03 22:43:20.603 Error   Api Logger  Some Error Message  An exception    5   A computer name

AppId 0是我的Api,5是一些远程应用程序,此时硬编码为POC。

可能是星期五,但我似乎无法弄清楚代码有什么问题。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:7)

我有这个问题,并针对我的具体情况找到了问题。问题是每个目标上到处都是双重条目。

我有一个.NET Core Web应用程序,它使用Program.cs IWebHostBuilder中的UseNLog()。这在内部执行AddNLog()。 然后在启动时我手动执行了loggerInstance.AddNLog(),这导致了双重插入。

后者必须删除,因为UseNLog是一个更好,更“快”的时间来启用NLog

希望它有所帮助!

答案 1 :(得分:2)

NLog 中的规则可以是特定于目标的,或者它可以写入所有目标。默认规则不会指定任何目标,因此他们会写入您创建的任何目标。您还要添加自己的规则,该规则专门针对您的目标而不是其他目标。

因此,双重记录。

您可以删除默认规则来解决问题。

Config.LoggingRules.Clear();

在添加规则之前。