log4net (common.logging) ошибочное исключение
У меня есть следующий оператор log4net в приложении aC#:
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, формат String, аргументы Object[]) в System.String.Format(поставщик IFormatProvider, формат String, аргументы Object[]) в Common.Logging.Factory.AbstractLogger.FormatMessageCallbackFormatMessageage(Формат строки, Object[] args)
Если вы заметили в строке (которая, в данном случае, полностью мусор), есть одна скобка "{". Я вполне уверен, что это вызывает исключение. Что я могу сделать, чтобы избежать этого? Избежать строки как-нибудь?
Это довольно безопасное исключение, за исключением того, что оно отображается в файле журнала и отвлекает.
2 ответа
В итоге функция журнала Common.Logging использует функции string.Format независимо от того, нужны они или нет. Таким образом, как упомянуто в комментариях @HansKesting, необходимо избегать любых непреднамеренных скобок (скобок). Поэтому, когда я регистрирую данные, которые, как я подозреваю, имеют эту проблему, я изменил код на:
notice = notice.Replace("{", "{{");
log.Info(CultureInfo.InvariantCulture, m => m(notice));
Надеется, что это помогает другим.
Вы используете самозаписываемое расширение, которое принимает Action в качестве аргумента журнала. Ваш метод m(строка) вызывает ошибку. Вы должны проверить исходный код вашего метода m. Log4net сам по себе никогда не вызовет никаких ошибок, потому что он разработан так, чтобы отказывать в молчании. Если ошибка вызвана log4net, вы найдете критическую ошибку.
Причина log4net не принимает Action<string>
в качестве аргумента, это может иметь побочные эффекты, как это.