【问题标题】:log4net (common.logging) erroneous exceptionlog4net (common.logging) 错误异常
【发布时间】:2016-11-07 20:39:51
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为您最好将其标记为 Common.Logging
  • 您使用的是什么 log4net? log.Info(CultureInfo.InvariantCulture, m =&gt; m(notice)); 甚至不会编译为 log.Info 的第二个参数是 Exception 而不是表达式
  • 您可以通过将{} 加倍以在String.Format 中使用它们。所以{{}}。或者,如果您不想,请不要使用 String.Format。
  • @sqmoore,你说得很对,'common.logging',这将澄清其他 cmets 的一些困惑。
  • @HansKesting - { 括号来自字符串数据,我正在尝试处理,我想要一个比在输出前按摩字符串更理想的选择。另外,我自己没有使用 string.Format。

标签: c# log4net string.format common.logging


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    log4net 不接受Action&lt;string&gt; 作为参数的原因是它可能有这样的副作用。

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 2011-01-15
      • 2010-10-07
      • 2016-03-28
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多