Ich schreibe einen WEB-API-Aufruf für NLog, so dass Remote-Anwendungen zu meiner Protokolltabelle protokollieren können.Wie kann ich NLog von doppelter Protokollierung stoppen
In meinem Controller Ich habe (hartcodiert für jetzt als Plausibilitätsprüfung):
NLogger.LogError("Some Error Message", "An exception", 5, "A computer name");
Dann meine statische LogError Methode sieht wie folgt aus (Ich habe versucht LogEventInfo() zu):
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);
}
Schließlich, das ist mein Code erster Config für diese Regel ist (es gibt zwei andere mit verschiedenen db Zielen):
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));
}
I 1 log pro Protokoll Aufruf der Logger-Instanz erwarten, aber ich bin immer zwei, und ich bin mir nicht ganz sicher, warum:
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 meine Api ist, 5 ist einige Fernapp, hart codiert an dieser Punkt als POC.
Könnte sein, dass es Freitag ist, aber ich kann nicht herausfinden, was mit dem Code falsch ist. Jede Hilfe wäre willkommen!
Überprüfen Sie, ob 'Config.LoggingRules' andere Regeln enthält. Ich wette, das tut es. – Amy
Ja, es hat sich herausgestellt, dass sie kumulativ sind: http://nlog-forum.1685105.n2.nabble.com/Log-generated-twice-in-logfile-td4682750.html. Ich denke, die Regeln sind nicht zielspezifisch, wie ich dachte (warum gebe ich ihnen dann mein Ziel). Fühlen Sie sich frei, als Antwort zu posten, und ich werde es akzeptieren, um die Frage als geschlossen zu markieren. Ich habe die problematische Regel so eingestellt, dass der Fehler min max protokolliert wird und der andere fatal min max protokolliert, was mein Problem behoben hat, nicht ideal, aber ich werde wahrscheinlich später eine benutzerdefinierte Stufe für die API erstellen. – RandomUs1r
Regeln * können * zielspezifisch sein. Konfigurieren über die XML-Datei Die Regel verfügt über die 'writeTo'-Eigenschaft mit einer durch Kommas getrennten Liste von Zielen. Sie können diese Eigenschaft auch weglassen, und sie schreibt in alle Ziele. Ich bin weniger vertraut mit der API-Konfiguration, aber es ist wahrscheinlich analog. Die Standardregeln schreiben wahrscheinlich auf alle Ziele. – Amy