2017-03-03 90 views
0

我正在爲NLog編寫WEB API調用,因此遠程應用程序可以登錄到我的日誌記錄表。如何停止雙日誌記錄中的NLog

在我的控制器我有(硬編碼現在作爲一個健全檢查):

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人用不同的DB目標):

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。

可能是星期五,但我似乎無法弄清楚代碼有什麼問題。任何幫助,將不勝感激!

+1

檢查'Config.LoggingRules'是否包含任何其他規則。我敢打賭,它確實。 – Amy

+0

是的,它確實是,它們是累積的:http://nlog-forum.1685105.n2.nabble.com/Log-generated-twice-in-logfile-td4682750.html。我想這些規則並不像我想象的那樣具體化(爲什麼我會把它們傳給我的目標呢)。隨意發佈爲答案,我會接受它將問題標記爲已關閉。我將麻煩的規則設置爲記錄錯誤最小值,另一個記錄致命最小值,這固定了我的問題,並不理想,但我可能會稍後爲Api定製一個自定義級別。 – RandomUs1r

+0

規則*可以*爲特定目標。通過XML進行配置,該規則具有'writeTo'屬性,其中包含以逗號分隔的目標列表。您也可以省略該屬性,並寫入所有目標。我對API配置不太熟悉,但它可能類似。默認規則可能會寫入所有目標。 – Amy

回答

2

NLog中的規則可以爲具體目標,也可以寫入所有目標。默認規則沒有指定任何目標,因此它們會寫入您創建的任何目標。你還添加了你自己的規則,專門寫給你的目標,而不是其他人。

因此,雙重記錄。

您可以刪除默認規則來解決問題。

Config.LoggingRules.Clear(); 

在添加規則之前。

1

我有這個問題,發現問題,對於我的具體情況。問題是每個目標上到處都有兩個條目。

我有一個.NET Core Web應用程序,它使用Program.cs IWebHostBuilder中的UseNLog()。這在內部執行AddNLog()。 然後在啓動時我手動做了loggerInstance.AddNLog(),這導致了雙重插入。

後者必須拆除,因爲UseNLog是一個更好的和「更快」的時間,讓NLOG

希望它能幫助!