8

log4net を使用して Web アプリの進行状況を記録し、Log4PostSharp を使用してすべてのメソッドを AOP 注入しています。これは、(ほぼ) すべてをログに記録するという望ましい効果があり、問題ありません。

JUST Page_Load メソッドをファイル/コンソールに記録する必要があります。これを行うために log4postsharp クラスを明らかにハムストリング化することはできますが、そうすると他のすべてのログが失われてしまいます。

StringMatch フィルターから始めて、log4net のフィルターを調べてきましたが、それはログに記録されているメッセージのみを調べており、メソッド名の後にいます。これにより、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"/>

ご覧のとおり、LocationInfo を介してログ イベントの MethodName にキーを入力しようとしていますが、まだすべてがログに記録されています。編集: コメントで述べたように、RTFM の後に追加した DenyAllFilter を含めました ;-)

誰でも手伝ってもらえますか?

ありがとうございました、

マイク K.

4

1 に答える 1

5

私が知る限り、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"/>
于 2010-05-02T12:12:08.583 に答える