2

我在 ac# 应用程序中有以下 log4net 语句:

log.Info(CultureInfo.InvariantCulture, m => m(notice));

字符串内容为:

notice = "Checking: 645: Bp $B!!:{4V7r;K Bp $B$D$^$M$5$S (B <xxx@xxxxxx. Co. Jp> (B <xxxxx@xxxxxxx.Com>)"

导致此异常:

[Common.Logging.Factory.AbstractLogger+FormatMessageCallbackFormattedMessage]System.FormatException:索引(从零开始)必须大于或等于零且小于参数列表的大小。在 System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args) 在 System.String.Format(IFormatProvider provider, String format, Object[] args) 在 Common.Logging.Factory.AbstractLogger.FormatMessageCallbackFormattedMessage.FormatMessage (字符串格式,Object[] args)

如果您在字符串中注意到(在这种情况下,这完全是一块垃圾),则有一个括号“{”。我相当确定这是导致异常的原因。我能做些什么来避免这种情况?以某种方式转义字符串?

这是一个相当无害的异常,只是它显示在日志文件中并且会分散注意力。

4

2 回答 2

2

最终 Common.Logging 日志函数使用 string.Format 函数,无论它们是否需要。因此,正如@HansKesting 在评论中提到的那样,将需要转义任何意外的括号(大括号)。因此,在记录我怀疑有此问题的数据时,我将代码更改为:

notice = notice.Replace("{", "{{");
log.Info(CultureInfo.InvariantCulture, m => m(notice));

希望这对其他人有所帮助。

于 2013-08-01T09:07:52.280 回答
0

您正在使用接受 Action 作为日志参数的自写扩展。您的方法 m(string) 会导致错误。您应该检查方法 m 的源代码。Log4net 它自己永远不会导致任何错误,因为它被设计为静默失败。如果错误是由 log4net 引起的,你会发现一个严重的错误。

log4net 不接受 a Action<string>as 参数的原因是它可能有这样的副作用。

于 2013-07-29T13:38:18.890 回答