2017-03-03 2 views
0

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!

+1

Überprüfen Sie, ob 'Config.LoggingRules' andere Regeln enthält. Ich wette, das tut es. – Amy

+0

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

+0

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

Antwort

2

Regeln in NLog können zielspezifisch sein, oder es kann alle Ziele schreiben. Für die Standardregel (n) sind keine Ziele angegeben, sodass sie in alle von Ihnen erstellten Ziele schreiben. Sie fügen auch eine eigene Regel hinzu, die speziell auf Ihr Ziel schreibt und keine anderen.

Also die Doppelprotokollierung.

Sie können die Standardregeln entfernen, um das Problem zu beheben.

Config.LoggingRules.Clear(); 

bevor Sie Ihre Regel hinzufügen.

1

Ich hatte dieses Problem und fand das Problem, für meinen speziellen Fall. Problem war doppelte Einträge überall auf jedem Ziel.

Ich hatte eine .NET Core-Webanwendung, die die UseNLog() innerhalb der Program.cs IWebHostBuilder verwendet. Dies führt AddNLog() intern aus. Dann habe ich beim Start manuell loggerInstance.AddNLog(), was die doppelte Einfügung verursacht.

Letztere müssen entfernt werden, da UseNLog eine weit bessere und „früher“ Zeit ist NLog

Hoffe, es hilft zu ermöglichen!

Verwandte Themen