log4net(common.log)错误异常

本文关键字:错误 异常 log common log4net | 更新日期: 2023-09-27 18:25:23

我在c#应用程序中有以下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提供程序,字符串格式,Object[]参数)位于System.String.Format(IFormatProvider提供程序,字符串格式,Object[]参数)在Common.Logging.Factory.AbstractLogger.FormatMessageCallbackFormattedMessage.FormatMessage(字符串格式,Object[]args)

如果你注意到字符串(在这种情况下,它完全是一块垃圾)中有一个括号"{"。我很确定这是导致异常的原因。我该怎么做才能避免这种情况?以某种方式逃离字符串?

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

log4net(common.log)错误异常

最终Common.Logging日志函数使用了字符串。格式化函数,无论是否需要它们。因此,正如@HansKesting在评论中提到的那样,需要转义任何意外的括号(大括号)。所以,当记录我怀疑我有这个问题的数据时,我把代码改为:

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

希望这能帮助到别人。

您使用的是自写扩展,它接受Action作为日志参数。您的方法m(字符串)导致错误。你应该检查你的方法m的源代码。Log4net本身永远不会引起任何错误,因为它是设计为无故障的。如果这个错误是由log4net引起的,那么你会发现一个严重的错误。

log4net不接受Action<string>作为参数的原因是它可能会产生这样的副作用。