2010-09-07 2 views
19

В настоящее время в моем приложении с несколькими лог-файлами используется log4net.Log4Net - выход из таблицы исключений stacktrace только для определенных файлов

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

Вызов я использую это Log.Error(myMessage, myException);

Мой конфиг можно увидеть ниже:

<configuration> 
    <log4net> 

    <root> 
    <level value="ALL"/> 
    <appender-ref ref="GeneralTextLog"/> 
    <appender-ref ref="ErrorTextLog"/> 
    </root> 

<!-- The general appender rolls by date --> 
<appender name="GeneralTextLog" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <level value="ALL"/> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%d{HH:mm:ss.fff} [%type] %-5p %message%n"/> 
    </layout> 
    <rollingStyle value="Date"/> 
    <file value="C:/Logs/General_"/> 
    <datePattern value="yyyy_MM_dd'.log'" /> 
    <appendToFile value="true"/> 
    <staticLogFileName value="false"/> 
</appender> 

<!-- The Error appender rolls by date --> 
<appender name="ErrorTextLog" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="WARN"/> 
    <levelMax value="FATAL"/> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%d{HH:mm:ss.fff} [%type] %-5p %message%newline%exception"/> 
    </layout> 
    <rollingStyle value="Date"/> 
    <file value="C:/Logs/Error_"/> 
    <datePattern value="yyyy_MM_dd'.log'" /> 
    <appendToFile value="true"/> 
    <staticLogFileName value="false"/> 
</appender> 

<!-- Loggers --> 
<logger name="DefaultLogger"> 
    <appender-ref ref="GeneralTextLog"/> 
    <level value="ALL"/> 
</logger> 

<logger name="ErrorLogger"> 
    <appender-ref ref="ErrorTextLog"/> 
    <levelMin value="WARN"/> 
    <levelMax value="FATAL"/> 
</logger> 

Несмотря на то, что я только включал% исключение в conversionPattern для журнала ошибок в обеих журналах отображается стек. Кто-нибудь знает, как я могу остановить это?

ответ

37

Настройка макета, как это (GeneralTextLog Appender):

<layout type="log4net.Layout.PatternLayout"> 
    <IgnoresException value="False" /> 
    ... 

Установка IgnoresException к ложным говорит Appender, что макет будет заботиться о исключение. Таким образом, вы можете не печатать трассировку стека.

+0

Это сработало. Спасибо. – Rob

0

Из вашей конфигурации, похоже, что ваша трассировка стека была включена как часть вашего параметра message.

EDIT - Я должен был быть яснее. Я предполагаю, что когда вы вызывали методы ведения журнала log4net, ваш первый параметр (который равен message) содержал трассировку стека, но это всего лишь предположение. Это также единственный параметр в обоих ваших приложениях. Если у вас нет параметра в вашем формате appender, он не должен появляться в обоих журналах ... если, конечно, ваш appender с исключением не является основным приложением.

Попробуйте это вместо того, чтобы увидеть, что происходит:

<!-- Loggers --> 
<root> 
    <appender-ref ref="GeneralTextLog"/> 
    <level value="ALL"/> 
</root> 

<logger name="ErrorLogger"> 
    <appender-ref ref="ErrorTextLog"/> 
    <levelMin value="WARN"/> 
    <levelMax value="FATAL"/> 
</logger> 
+0

Трассировка стека не содержится в первом сообщении paramater. Сообщение представляет собой простую текстовую строку «Ошибка», исключение передается как второй параметр. Изменение его в вышеприведенной конфигурации сделало так, что запись в журнале появилась только в одном из файлов (generalTextLog), все еще с трассировкой стека. – Rob

+0

@ Rob okay, спасибо, что сообщили мне. Я не использовал «ВСЕ» раньше в моих конфигурациях, только «DEBUG» или определенный диапазон. Единственное, что я могу догадаться, это то, что ALL может быть ответственным, но для этого значения параметра нет никакой документации. Попробуйте DEBUG вместо этого. Кстати, какой метод вы вызываете для этого ведения журнала? Я предполагаю, что это logger.Debug(), поскольку он не появляется в ErrorLogger? – Dave

+0

@Rob извините, понимание прочитала меня. Я вижу, что вы используете Error(). – Dave

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