2016-09-26 3 views
0

Я использую log4net api для входа в мое приложение WinForms. У меня есть несколько приложений: RollingFileAppender и TextBoxAppender (пользовательский appender).log4net сообщения журнала только для нескольких добавок

Я хочу регистрировать некоторые сообщения об ошибках только в файле журнала (RollingFileAppender), а не в текстовом поле (TextBoxAppender) и некоторых других сообщениях для обоих. Как я могу это достичь? Обратите внимание, что сообщения имеют одинаковый уровень, то есть все сообщения ERROR.

Спасибо.

EDIT 1:

В частности, я хочу, чтобы отобразить простые сообщения на одну строку ошибка в интерфейсе, а также файл журнала, но StackTraces только в файле журнала.

+1

Хотя вы * можете * сделать это только с одним регистратором (через подходящее применение F ilters), это идет против зерна log4net. То, что вы обычно хотите сделать, это использовать отдельные регистраторы для каждой конфигурации и добавлять соответствующие приложения к этим регистраторам ('FileLogger',' UILogger', 'UniversalLogger', что-то вроде этого). Обратите внимание, что регистраторы могут делиться приложением. –

+0

Даже если я должен использовать отдельные регистраторы, как я могу фильтровать сообщения одного уровня, например, некоторые сообщения ERROR уровня журнала, которые будут отображаться в UILogger, и некоторые сообщения одного и того же ERROR уровня журнала, НЕ будут показаны. В основном, то, что вы предлагаете, заключается в том, что для каждого места мне может потребоваться вызвать оба регистратора по мере необходимости, например logger1.Error() и logger2.Error() – AllSolutions

+0

Использование нескольких экземпляров регистратора может быть прекрасным, когда я хочу отправить сообщение журнала только для 1 адресата, но для большинства случаев требуются сообщения, отправляемые в BOTH регистраторам – AllSolutions

ответ

2

Как я понимаю, вы действительно хотите, чтобы сообщения отправлялись в оба приложения, но только один из них отслеживает трассировки стека. Во-первых, журнал сообщений, включая исключение в качестве исключения, не используйте Exception.ToString():

logger.Error($"Something went wrong frobbing the widget: {ex.Message}", ex); 

Тогда ваш регистратор может использовать несколько appenders, некоторые из которых опускаем трассировки стека, говоря log4net мы будем заботиться об исключениях (на самом деле ничего не делать с ними):

<appender name="TextBoxAppender" type="MyAppenders.TextBoxAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <ignoresException value="false" /> 
     <conversionPattern value="%m%n" /> 
    </layout> 
</appender> 

и другие с полной информацией:

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d{ISO8601} [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 
+0

Для TextBoxAppender я установил ignoresException в true, и я изменил код на: logger.Error («Stack Trace:», ex) ;. Тем не менее текстовое поле отображает трассировку стека. Что я упустил? Моя схема преобразования: AllSolutions

+0

Ой, я смущен. 'ignoresException' должно быть' false', чтобы указать, что макет * * обрабатывает исключение, - не печатая его. –

+0

Ok Да :) Установив его в false, я могу подавить трассировку стека в пользовательском интерфейсе. Но так как мой код: logger.Error («Stack Trace:», ex); пользовательский интерфейс отображает слова «Трассировка стека». Что я должен передать в первом параметре, если я не хочу, чтобы пользовательский интерфейс отображал что-нибудь? – AllSolutions

1

Решение для вывода различных сообщений на различные appenders должно быть ForwardingAppender (документация по logging.apache, кажется вниз в настоящее время, но в любом случае здесь ссылка: https://logging.apache.org/log4net/release/sdk/log4net.Appender.ForwardingAppender.html)

Здесь вы можете фильтровать на loglevel (большинство примеров), но также на основе сообщений журнала (см. здесь: http://www.codeproject.com/Articles/140911/log-net-Tutorial, абзац «StringMatchFilter»)

По крайней мере, это поможет вам принести только одно сообщение одному конкретному Appender. Чтобы узнать, как опустить стек, см. Jeroen Mosterts ответить

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