繁体   English   中英

log4net(common.logging)错误异常

[英]log4net (common.logging) erroneous exception

我在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.String.Format(IFormatProvider提供程序,String格式,Object [] args)在System.Text.StringBuilder.AppendFormat(IFormatProvider提供程序,String格式,Object [] args)在Common.Logging.Factory.AbstractLogger.FormatMessageCallbackFormattedMessage.FormatMessage (字符串格式,Object []参数)

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

这是一个相当无害的例外,只不过它显示在日志文件中并且分散了注意力。

最后,Common.Logging日志函数使用string.Format函数,而不管是否需要它们。 因此,正如@HansKesting在评论中提到的那样,需要转义所有不需要的括号(花括号)。 因此,当记录我怀疑存在此问题的数据时,我将代码更改为:

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

希望这对其他人有帮助。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM