Как и log4net фильтры вместе - PullRequest
       34

Как и log4net фильтры вместе

8 голосов
/ 28 декабря 2011

Я хотел бы создать приложение, которое регистрирует только для определенного уровня и только для определенного регистратора.Из того, что я вижу, и основываясь на этом уроке , фильтры ORed вместе.Как я могу И фильтры log4net вместе?Вот пример того, что я делаю:

<appender name="MyAppender">
      <!--log only INFO level-->
      <filter type="log4net.Filter.LevelMatchFilter">
          <levelToMatch value="INFO" />
      </filter>

      <!--log only UserController logger-->
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="MyLogger" />
      </filter>

      <!-- do not log anything else -->
      <filter type="log4net.Filter.DenyAllFilter" />
</appender>

Ответы [ 3 ]

8 голосов
/ 15 января 2012

Вы можете написать собственный AndFilter, что довольно просто.Вы можете использовать код, размещенный здесь - https://stackoverflow.com/a/8859037/984438

Использование будет выглядеть так:

<filter type="Namespace.AndFilter, Assembly">
      <!--log only INFO level-->
      <filter type="log4net.Filter.LevelMatchFilter">
          <levelToMatch value="INFO" />
      </filter>

      <!--log only UserController logger-->
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="MyLogger" />
      </filter>
      <acceptOnMatch value="true"/>
</filter>
<!-- do not log anything else -->
<filter type="log4net.Filter.DenyAllFilter" />
7 голосов
/ 18 мая 2015

Вы можете использовать ForwardingAppender (см. Примеры конфигураций ) и поместить один фильтр туда, а другой - в целевом приложении (или связать их по желанию).

<appender name="FilterOnlyInfo" type="log4net.Appender.ForwardingAppender">
  <!--log only INFO level-->
  <filter type="log4net.Filter.LevelMatchFilter">
      <levelToMatch value="INFO" />
  </filter>
  <appender-ref ref="FinalAppender" />
</appender>
<appender name="FinalAppender">
  <!--log only UserController logger-->
  <filter type="log4net.Filter.LoggerMatchFilter">
    <loggerToMatch value="MyLogger" />
  </filter>
</appender>

Я верюВозможно, appender не был частью log4net во время вопроса.

2 голосов
/ 28 декабря 2011

Обход

Я только что предложил следующий обходной путь, который, похоже, помогает. Сначала я удалил фильтр loggerToMatch из приложения appender. Затем я изменил настройки логгера следующим образом:

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

<logger name="MyLogger">
      <level value="INFO" />
      <appender-ref ref="MyAppender" />
</logger>

Поскольку у меня только один фильтр, моя логика фильтра в порядке. Раздел logger указывает на этот appender только для моего выбранного logger, но все остальные appdenders также принимают событие, потому что они указаны в корне. Это работает, но не объясняет, как и фильтры вместе в приложении. Я все еще хотел бы знать.

...