簡體   English   中英

為什么我會使用 NLog 獲得 FormatException?

[英]Why do I get FormatException with NLog?

我在內部 NLog 日志中得到以下信息:

2020-05-10 16:38:09.9251 Warn Error when formatting a message. Exception: System.FormatException: The input string had an incorrect format.
   vid System.Text.StringBuilder.FormatError()
   vid System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)
   vid System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args)
   vid System.String.Format(IFormatProvider provider, String format, Object[] args)
   vid NLog.LogEventInfo.CalcFormattedMessage()

如果像這樣填寫 LogEventInfo:

var logEvent = new LogEventInfo();
                    logEvent.Level = logData.LogLevel.ToLogLevel();
                    logEvent.Message = JsonConvert.SerializeObject(logData, Formatting.Indented);
                    logEvent.Properties.Add("logdata", logData);
                    logEvent.Parameters = new object[1] { logData };
                    _genLogger.Log(logEvent);

當我將 Message 設置為此時,警告似乎來自:

{
  "ComputerName": null,
  "LogLevel": 5,
  "LogId": null,
  "PersonId": null,
  "Text": "Communication Message",
  "TimeStamp": "2020-05-10T16:42:55.9456429+02:00",
  "ExceptionTyp": 7,
  "UserMessage": null,
  "RelatedObjectJsonString": "[\r\n  {\r\n    \"Address\": \"https://192.168.130.29:44476/MyApp5Service/Client\",\r\n    \"IsEmpty\": false,\r\n    \"IsFaulted\": false,\r\n    \"Action\": \"GetUserConfigurations\",\r\n    \"CallDirection\": 0,\r\n    \"EventTime\": \"2020-05-10T16:42:55.9406583+02:00\",\r\n    \"IsCallback\": false\r\n  }\r\n]",
  "SystemInformation": ""
}

我究竟做錯了什么?

問候

消息是字符串格式或結構化格式的消息。 這些參數用於格式化消息。

例子

字符串格式

當所有模板持有者都是數字時(在{}之間),消息被用作字符串格式的消息。

logger.Info("Logon by user:{0} from ip_address:{1}", "Kenny", "127.0.0.1");

其中第一個參數是消息,其他參數是參數

結構化格式:

logger.Info("Logon by {user} from {ip_address}", "Kenny", "127.0.0.1"); // Logon by "Kenny" from "127.0.0.1"

目前的問題

所以我們在這里做類似的事情:

string.Format("{
  "ComputerName": null,
  "LogLevel": 5,
  "LogId": null,
  "PersonId": null,
  "Text": "Communication Message",
  "TimeStamp": "2020-05-10T16:42:55.9456429+02:00",
  "ExceptionTyp": 7,
  "UserMessage": null,
  "RelatedObjectJsonString": "[\r\n  {\r\n    \"Address\": \"https://192.168.130.29:44476/MyApp5Service/Client\",\r\n    \"IsEmpty\": false,\r\n    \"IsFaulted\": false,\r\n    \"Action\": \"GetUserConfigurations\",\r\n    \"CallDirection\": 0,\r\n    \"EventTime\": \"2020-05-10T16:42:55.9406583+02:00\",\r\n    \"IsCallback\": false\r\n  }\r\n]",
  "SystemInformation": ""
}", logData);

不要認為那是你需要的;)

解決方案

我不確定您是否需要消息中的數據。 所以列出了這兩個選項。

JSON 不需要自己轉換數據。 這可以在配置中完成。

消息中的數據

我建議在這里使用結構化日志記錄。

logger.Log(loglevel, "Message with {LogData}", logData);

您可以在配置中將 logData 呈現為 JSON,如下所示:

${event-properties:item=LogData:jsonEncode=true}

${json-encode}${event-properties}

注意:您可以控制如何呈現消息( ${message} ),請參閱如何使用結構化日志記錄

消息中沒有數據

使用.WithProperty ,它是屬性的語法糖。

logger.WithProperty("LogData", logData).Log(loglevel, "Message without LogData");

同樣在這里,您可以使用${event-properties:item=LogData:jsonEncode=true}將 object 渲染為 JSON

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM