Настройте log4net для отправки ошибок в разные приложения в зависимости от уровня

Я хочу отправить информационный уровень и выше в приложение XML и уровень ошибок/неустранимых ошибок в приложение EventLog.

Я понимаю, что мне нужно изменить корневой элемент конфигурации, но я борюсь с синтаксисом. Каков синтаксис конфигурации для направления журналов к правильному приложению для данного уровня или диапазона уровней?

Пока такая конфигурация:

<log4net>
  <appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender">
    ...
  </appender>
  <appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender">
    ...
  </appender>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="SomeXmlAppender" />
    <appender-ref ref="SomeEventLogAppender" />
  </root>
</log4net>

Редактировать: Спасибо @agileguy. Этот пост действительно содержал нужный мне синтаксис. Теперь рабочее решение выглядит так:

<log4net>
  <appender name="SomeXmlAppender" type="log4net.Appender.RollingFileAppender">
    ...
    <evaluator type="log4net.Core.LevelEvaluator">
      <threshold value="INFO"/>
    </evaluator>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="INFO" />
      <acceptOnMatch value="true" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
  </appender>
  <appender name="SomeEventLogAppender" type="log4net.Appender.EventLogAppender">
    ...
    <evaluator type="log4net.Core.LevelEvaluator">
      <threshold value="ERROR"/>
    </evaluator>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="ERROR" />
      <acceptOnMatch value="true" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
  </appender>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="SomeXmlAppender" />
    <appender-ref ref="SomeEventLogAppender" />
  </root>
</log4net>

person grenade    schedule 07.09.2009    source источник
comment
Я думаю, что статья мистера Грэма здесь заставит вас идти.   -  person Daniel Elliott    schedule 07.09.2009
comment
Обратите внимание, что оценщик используется только теми приложениями, которые поддерживают буферизацию. Если вы хотите указать определенный уровень для каждого приложения, вам нужно использовать только элемент ‹threshold› сам по себе — его не нужно оборачивать в оценщик.   -  person Brian    schedule 24.01.2011
comment
Элемент ‹evaluator› следует использовать только для приложений, реализующих BufferingAppenderSkeleton (т. е. не RollingFileAppender).   -  person dave    schedule 27.07.2014


Ответы (2)


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

<configuration>
  <log4net>
    <!--Database appender-->
    <appender name="DbAppender" type="log4net.Appender.ADONetAppender">
      <bufferSize value="0" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="Data Source=AEG-PC\SQLEXPRESS;Initial Catalog=JCZ6;Uid=sa;Pwd=qwerty;" />
      <commandText value="INSERT INTO Log4Net ([date],[thread],[level],[logger],[message],[exception]) VALUES 
         (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%t" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="10" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%p" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%c" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%m" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
      <threshold value="Error" /> <!--THIS IS THE IMPORTANT LINE-->
    </appender>
    <!--File appender-->
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="log-file.txt" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="INFO" />
      <appender-ref ref="FileAppender" />
      <appender-ref ref="DbAppender" />
    </root>
  </log4net>
</configuration>
person Francisco Goldenstein    schedule 22.05.2014

У меня такой же вопрос. Похоже, если я понимаю первоначальный вопрос, пороговые значения не будут работать, поскольку они будут отправлять определенный вывод в один аппликатор, а это плюс остальное - в другой аппендер. Я смог заставить его работать, используя LevelRangeFilter, как было предложено выше. Я хотел, чтобы ОШИБКА, ИНФОРМАЦИЯ и ПРЕДУПРЕЖДЕНИЕ шли к одному аппендеру, а все остальные - к другому аппендеру, но не ОШИБКА, ИНФОРМАЦИЯ и ПРЕДУПРЕЖДЕНИЕ.

Вот конфигурация, которая работала для меня:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
    <log4net>
        <appender name="LoggingAppender" type="log4net.Appender.FileAppender" >
            <file value="logs.txt" />
            <filter type="log4net.Filter.LevelRangeFilter">
                <levelMin value="INFO"/>
                <levelMax value="OFF"/>
            </filter>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
            </layout>
        </appender>
        <appender name="TracingAppender" type="log4net.Appender.FileAppender" >
            <file value="traces.txt" />
            <filter type="log4net.Filter.LevelRangeFilter">
                <levelMin value="ALL"/>
                <levelMax value="DEBUG"/>
            </filter>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
            </layout>
        </appender>
        <root>
            <appender-ref ref="LoggingAppender"/>
            <appender-ref ref="TracingAppender"/>
        </root>
    </log4net>
</configuration>

Спасибо, Ник

person nickdu    schedule 06.07.2015