2010-04-14 12 views
7

Używam log4net do rejestrowania postępów mojej aplikacji internetowej, za pomocą Log4PostSharp do AOP-wstrzyknięcia wszystkich metod. Ma to pożądany efekt logowania (prawie) wszystkiego i jest w porządku.Filtrowanie log4net na nazwie metody - nie mogę tego uzyskać

Mam teraz wymóg rejestrowania metod JUST Page_Load w pliku/konsoli. Mogę oczywiście ściskać klasę log4postsharp, ale wtedy tracę wszystkie inne rejestracje.

Szukałem filtrów w log4net, zaczynając od filtru StringMatch, ale to tylko przegląda rejestrowany komunikat i szukam nazwy metody. To postawiło mnie na PropertyFilter, ale wciąż bez radości. Moja log4net.config fragment jest tak:

<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"/> 

Jak widać, staram się klucz do MethodName zdarzenia rejestrowania poprzez LocationInfo, ale ja wciąż się wszystko rejestrowane. EDYCJA: Jak wspomniano w komentarzach, mam teraz włączone DenyAllFilter, które dodałem po RTFM ;-)

Czy ktoś może pomóc?

Dziękuję

Mike K.

+0

NB: Mam teraz dodaje po filtr, aby zatrzymać wszystko inne jest zalogowany raz otrzymuję filtr methodname working –

+0

Dodałeś DenyAllFilter? Czy otrzymujesz wtedy wszystko lub nic? powinieneś zaktualizować swoje pytanie, aby odzwierciedlić swoje postępy. –

Odpowiedz

4

O ile mogę powiedzieć log4net nie wie nieruchomośćLocationInfo.MethodName. Nie używam Log4PostSharp, więc nie mogę stwierdzić na pewno, czy Log4PostSharp utworzyłby tę właściwość.

chciałbym napisać własny filtr tak, aby filtrować według nazwy metody (część regex pominięta):

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; 
    } 
} 

Uwaga: Dostęp LocationInfo jest drogie i może mieć znaczący wpływ na wydajność. Można rozważyć modyfikację Log4PostSharp, aby wyodrębnić nazwę metody podczas tkania i zapisać ją w niektórych właściwościach. W takim przypadku można użyć filtru właściwości zgodnie z zamierzeniami i nie wpłynie to na wydajność. Nie jestem pewien, czy to naprawdę działa, ale spodziewam się, że jest to możliwe.

konfiguracja będzie wyglądać mniej więcej tak:

<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"/> 
+0

Gdzie/w jaki sposób zostanie przekazany m_stringToMatch? –

+0

Skonfiguruj ten nowy filtr w taki sam sposób, jak filtr właściwości. Po prostu nie potrzebujesz części . zobacz także moją poprawioną odpowiedź. –

+0

Dziękuję - masz nagrodę ;-) –

Powiązane problemy