为什么使用 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);
警告似乎来自于我将消息设置为此:
{
"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} and ${event-properties}
注意:您可以控制消息 (${message}
) 的呈现方式,请参阅 How to use structured logging
消息中没有数据
使用 .WithProperty
,它是 属性的语法糖 。
logger.WithProperty("LogData", logData).Log(loglevel, "Message without LogData");
您还可以在此处将对象渲染为 JSON 并使用 ${event-properties:item=LogData:jsonEncode=true}
我在内部 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);
警告似乎来自于我将消息设置为此:
{
"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} and ${event-properties}
注意:您可以控制消息 (${message}
) 的呈现方式,请参阅 How to use structured logging
消息中没有数据
使用 .WithProperty
,它是 属性的语法糖 。
logger.WithProperty("LogData", logData).Log(loglevel, "Message without LogData");
您还可以在此处将对象渲染为 JSON 并使用 ${event-properties:item=LogData:jsonEncode=true}