Фильтрация log4net на имени метода - не может вполне получить его

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

У меня теперь есть требование для входа ПРОСТО методов Page_Load в файл / консоль. Я могу, очевидно, зажать в тиски log4postsharp класс, чтобы сделать это, но затем я потерял бы все другие вход.

Я смотрел на, просачивается log4net, начиная с фильтра StringMatch, но который только смотрит на сообщение, зарегистрированное, и я после имени метода. Это поместило меня на PropertyFilter, но все еще без радости. Мой log4net.config отрывок таким образом:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <filter type="log4net.Filter.PropertyFilter">
    <key value="LocationInfo.MethodName"/>
    <stringToMatch value="Page_Load"/>
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
  <file value="d:\\xxxx\\yyyyy\\zzzzLog"/>

Как Вы видите, я пытаюсь ввести в MethodName регистрирующегося события через LocationInfo, но я все еще регистрировал все.Править: Как упомянуто в комментариях, я теперь включал DenyAllFilter, который я добавил после прочитайте руководство ;-)

Кто-либо может помочь?

Спасибо,

Mike K.

7
задан Stefan Egli 2 May 2010 в 11:08
поделиться

1 ответ

Насколько я могу судить, log4net не знает свойства LocationInfo.MethodName . Я не использую Log4PostSharp, поэтому я не могу точно сказать, создаст ли Log4PostSharp это свойство.

Я бы написал свой собственный фильтр, подобный этому, для фильтрации по именам методов (часть регулярного выражения опущена):

public class MethodNameFilter : StringMatchFilter
{       
     override public FilterDecision Decide(LoggingEvent loggingEvent) 
     {
         if (loggingEvent == null)
         {
              throw new ArgumentNullException("loggingEvent");
         }

         var locationInfo = loggingEvent.LocationInformation;

         // Check if we have been setup to filter
         if (locationInfo == null || (m_stringToMatch == null && m_regexToMatch == null))
         {
             // We cannot filter so allow the filter chain
             // to continue processing
              return FilterDecision.Neutral;
         }

         if (m_stringToMatch != null)
         {
             // Check substring match
             if (locationInfo.MethodName.IndexOf(m_stringToMatch) == -1) 
             {
                  // No match, continue processing
                  return FilterDecision.Neutral;
             }

             // we've got a match
             if (m_acceptOnMatch) 
             {
                  return FilterDecision.Accept;
             } 
             return FilterDecision.Deny;
         }
         return FilterDecision.Neutral;
    }
} 

Примечание. Доступ к LocationInfo является дорогостоящим и может заметно повлиять на производительность. Вы можете подумать об изменении Log4PostSharp, чтобы извлечь имя метода во время плетения и сохранить его в каком-либо свойстве. В этом случае вы можете использовать фильтр свойств по своему усмотрению, и это никак не повлияет на производительность. Не уверен, что это действительно работает, но я ожидал, что это возможно.

Конфигурация будет выглядеть примерно так:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
     <filter type="YourNameSpace.MethodNameFilter">
         <stringToMatch value="Page_Load"/>
     </filter>
     <filter type="log4net.Filter.DenyAllFilter" />
     <file value="d:\\xxxx\\yyyyy\\zzzzLog"/>
4
ответ дан 7 December 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: