如何阻止 NLog 重复记录
How can I stop NLog from double logging
我正在为 NLog 编写 WEB API 调用,因此远程应用程序可以登录到我的日志记录 table。
在我的控制器中我有(现在硬编码作为完整性检查):
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 个日志,但我得到了两个,我不确定为什么:
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 Core Web 应用程序,它在 Program.cs IWebHostBuilder 中使用了 UseNLog()。这在内部执行 AddNLog()。
然后在启动时我手动执行 loggerInstance.AddNLog() 导致双重插入。
后者必须被删除,因为 UseNLog 是一个更好的 "sooner" 时间来启用 NLog
希望对您有所帮助!
我正在为 NLog 编写 WEB API 调用,因此远程应用程序可以登录到我的日志记录 table。
在我的控制器中我有(现在硬编码作为完整性检查):
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 个日志,但我得到了两个,我不确定为什么:
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 Core Web 应用程序,它在 Program.cs IWebHostBuilder 中使用了 UseNLog()。这在内部执行 AddNLog()。 然后在启动时我手动执行 loggerInstance.AddNLog() 导致双重插入。
后者必须被删除,因为 UseNLog 是一个更好的 "sooner" 时间来启用 NLog
希望对您有所帮助!