Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何阻止NLog重复记录_C#_Nlog - Fatal编程技术网

C# 如何阻止NLog重复记录

C# 如何阻止NLog重复记录,c#,nlog,C#,Nlog,我正在为NLog编写一个WEB API调用,以便远程应用程序可以登录到我的日志表 在我的控制器中,我已经(现在硬编码为一个健全检查): 然后,我的静态LogError方法如下所示(我也尝试了LogEventInfo(): 最后,这是我对该规则的第一个代码配置(还有另外两个具有不同的db目标): 我希望对logger实例的每个日志调用有1个日志,但我得到了两个,我不确定原因: Id Date Level Logger Message Exception AppId M

我正在为NLog编写一个WEB API调用,以便远程应用程序可以登录到我的日志表

在我的控制器中,我已经(现在硬编码为一个健全检查):

然后,我的静态LogError方法如下所示(我也尝试了LogEventInfo():

最后,这是我对该规则的第一个代码配置(还有另外两个具有不同的db目标):

我希望对logger实例的每个日志调用有1个日志,但我得到了两个,我不确定原因:

   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

可能是星期五,但我似乎不知道代码出了什么问题。任何帮助都将不胜感激

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

因此,双重日志记录

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

Config.LoggingRules.Clear();

在添加规则之前。

我遇到了这个问题,并找到了问题所在,针对我的具体情况。问题是每个目标上都有两个条目

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

必须删除后者,因为使用NLog是启用NLog的更好且“更快”的时间


希望有帮助

检查
Config.LoggingRules
是否包含任何其他规则。我打赌是的。是的,事实证明它们是累积的:。我想这些规则并不像我想的那样针对特定的目标(为什么我要通过它们来达到我的目标)。请随意发布作为答案,我会接受它,将问题标记为关闭。我将麻烦规则设置为log error min max,另一个设置为log fatal min max,这解决了我的问题,这并不理想,但我可能会在以后为Api设置自定义级别。规则可以是特定于目标的。通过XML配置规则具有
writeTo
属性,目标列表以逗号分隔。您还可以忽略该属性,它将写入所有目标。我对API配置不太熟悉,但可能与之类似。默认规则可能会写入所有目标。我想这一行就是这么做的:Config.LoggingRules.Add(new LoggingRule(“*”,LogLevel.Error,LogLevel.Fatal,dbapierTarget))在重载中似乎没有第五个参数可以传入。我猜我错了,或者是马车。我将尝试清除,因为API调用的执行路径应该只关心我的自定义LogEventInfo。由于我对NLog配置API不熟悉,我无法真正回答这个问题。我一直使用XML配置。(提示:您可以使用反勾号格式化注释中的代码,如:
`hi`
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));
}
   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
Config.LoggingRules.Clear();