2015-02-09 2 views
1

У меня есть log4net, успешно настроенный для моего приложения C#. Все работает отлично, за исключением того, когда я делаю это:Исключение журнала log4net

catch (Exception ex) 
{ 
    if (log.IsErrorEnabled) 
     log.Error("test", ex); 
} 

Все, что я получаю сообщение «тест», я не получаю исключение вообще. Затем, когда я это делаю:

catch (Exception ex) 
{ 
    if (log.IsErrorEnabled) 
     log.Error(ex); 
} 

Я получаю исключение по желанию, трассировку стека и все остальное. Это работает, но в идеале я хотел бы иметь как сообщение, так и исключение.

Почему в первом примере не работает тот же самый код (без изменений конфигурации), но он работает во втором примере? Я читаю документы неправильно для метода Error()?

+0

Какой ты обладатель? – Filburt

+0

RollingFileAppender, я играл с шаблоном, форматом и т. Д. Предполагается напечатать исключение по умолчанию (я прочитал), но приведенный выше код не – landoncz

+0

Можете ли вы показать свою конфигурацию – stuartd

ответ

0

Решение не было релевантным в коде, который я опубликовал, но я не исправлял флаги правильно. Возможное решение было найдено в this stack overflow post

0

Попробуйте

log.ErrorFormat("test: {0}", ex); 
+0

Это работает! Я получаю исключение и трассировку стека и все. Любая идея, почему метод Error (string, exception) не работает? – landoncz

+0

Это может иметь какое-то отношение к вашей конфигурации appender. Не уверен, но рад, что это сработало для вас! :) –

+0

@landoncz, основанный на этом решении, работающем на вас, похоже, что перегрузка, которую вы пытались использовать, должна была сбрасывать «ex» в шаблон 'string.format', предоставленный в первом параметре, и поскольку не было a '{0}' включен, он просто игнорировался. – Scott

1

Первая перегрузка вы используете тот, который вы хотите: Error(string, Exception). Если исключение действительно написано, зависит от вашего приложения и/или выбранного вами макета. Здесь объясняется, как отключить печать stacktrace: https://stackoverflow.com/a/3660529/106567

Мне нужно увидеть вашу конфигурацию, чтобы узнать, почему исключение не печатается.

Код, который «работает» на самом деле не то, что вы должны сделать: log.Error(ex), похоже, делает то, что вы хотите, так как log4net рассматривает исключение как объект сообщения и просто вызывает toString() на нем. Любой appender/layout, который специально занимается исключениями, не сможет обработать исключение должным образом. То же самое происходит, если вы используете одну из перегрузок ErrorFormat (на самом деле я никогда не понимал, почему вы не можете использовать форматированную строку и исключение одновременно).

+0

Как log4net сможет различать аргументы строки формата и исключение ..? – stuartd

+0

, сделав исключение первым аргументом. что-то вроде: Ошибка (Exception ex, String message, params Object [] args) vs. Error (String message, params Object [] args) –

+0

Это правда, но наличие обмена сообщениями и исключений в списке параметров было бы неинтуитивным - 'Error (строковое сообщение)' и 'Error (строковое сообщение, исключение исключения)' и 'ErrorFormat (строковое сообщение, params object [] args)', но затем 'ErrorFormat (Exception ex, строковое сообщение, params object [] args)' - всегда может реализовать его как метод расширения. – stuartd

Смежные вопросы