I've been thinking about implementing filter as an action.  

An example:

appender x
 filter andfilter1
   nested filter levelmatch1
   ??? filter or nested filter andfilter2
             nested filter levelmatch2
             nested filter stringmatch2
               ...

What name should the ??? node use? nestedfilter or filter?

If the filter node name is only used for the immediate children of appender, it 
seems less useful than some other convention.

Maybe if andFilter was what used a new node name: containingfilter or something 
like that?

just looking for clarification

Scott

-----Original Message-----
From:   Ceki Gülcü [mailto:[EMAIL PROTECTED]
Sent:   Sat 1/8/2005 4:23 AM
To:     Log4J Developers List
Cc:     
Subject:        Re: cvs commit: logging-log4j/src/java/org/apache/log4j/filter  
AndFilter.java

Hi Scott,

While most Actions tend to be simple, actions that can be self-nested are 
not trivial to write, with NestComponentIA acts as a prime example of an 
action that can be self-nested (implicit objects potentially nesting other 
implicit objects).

Even if Joran can currently deal with nested filters just fine, we'd better 
explicitly create a FilterAction. If you rename the nested <filter> 
elements as <nestedFilter>, and change the addFilter() method in AndFilter 
to addNestedFilter, then we might gain in clarity.

  <filter class="org.apache.log4j.filter.AndFilter">

    <nestedFilter class="org.apache.log4j.filter.LevelMatchFilter">
      <param name="levelToMatch" value="DEBUG" />
      <param name="acceptOnMatch" value="true" />
    </nestedFilter>

    <nestedFilter class="org.apache.log4j.filter.StringMatchFilter">
      <param name="stringToMatch" value="test" />
      <param name="acceptOnMatch" value="true" />
    </nestedFilter>

    .... other nested filters go here

  </filter>

I have noticed that you are using an ArrayList to collect nested filters 
and iterate though them. Filters are designed to be chained together so you 
don't need an ArrayList to collect or iterate through them. See how 
AppenderSkeleton does it.

Oh, we also need an element called <filter-chain> so that we can reference 
filter chains by name.

<configuration>

   <filter-chain name="X-chain">
    <filter class="org.apache.log4j.filter.SomeFilter">
      <param name="levelToMatch" value="DEBUG" />
      <param name="acceptOnMatch" value="true" />
    </filter>
   <filter-chain>


   <appender name=X" class="org.apache.log4j...">
      <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %level [%thread] %logger 
- %m%n%stackTrace{X-chain}"/>
      </layout>
   </appender>
</configuration>

The filter-chain action would create a filter chain an add it by name in to 
the repository object bag by name. Later a stack trace converter could 
retreive this filter chain by name from the object bag in its owning 
repository.

Would you like to take a shot at this?

At 09:03 AM 1/8/2005, [EMAIL PROTECTED] wrote:
>sdeboy      2005/01/08 00:03:34
>
>   Modified:    src/java/org/apache/log4j/filter AndFilter.java
>   Log:
>   AndFilter now supports any number of contained filters, using Joran's 
> support for collections.
>
>   Revision  Changes    Path
>   1.2       +20 
> -20    logging-log4j/src/java/org/apache/log4j/filter/AndFilter.java
>
>   Index: AndFilter.java
>   ===================================================================
>   RCS file: 
> /home/cvs/logging-log4j/src/java/org/apache/log4j/filter/AndFilter.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- AndFilter.java    8 Jan 2005 06:57:48 -0000       1.1
>   +++ AndFilter.java    8 Jan 2005 08:03:34 -0000       1.2
>   @@ -16,16 +16,19 @@
>
>    package org.apache.log4j.filter;
>
>   +import java.util.ArrayList;
>   +import java.util.Iterator;
>   +import java.util.List;
>    import org.apache.log4j.spi.Filter;
>    import org.apache.log4j.spi.LoggingEvent;
>
>
>    /**
>   - * A filter that 'and's the results of two filters together.
>   + * A filter that 'and's the results of any number of contained filters 
> together.
>     *
>   - * For the filter to process events, both contained filters must 
> return Filter.ACCEPT.
>   + * For the filter to process events, all contained filters must return 
> Filter.ACCEPT.
>     *
>   - * If both filters do not return Filter.ACCEPT, Filter.NEUTRAL is 
> returned.
>   + * If the contained filters do not return Filter.ACCEPT, 
> Filter.NEUTRAL is returned.
>     *
>     * If acceptOnMatch is set to true, Filter.ACCEPT is returned.
>     * If acceptOnMatch is set to false, Filter.DENY is returned.
>   @@ -35,14 +38,14 @@
>     *
>     *<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
>     * <filter class="org.apache.log4j.filter.AndFilter">
>   - *  <filter1 class="org.apache.log4j.filter.LevelMatchFilter">
>   + *  <filter class="org.apache.log4j.filter.LevelMatchFilter">
>     *        <param name="levelToMatch" value="DEBUG" />
>     *        <param name="acceptOnMatch" value="true" />
>   - *  </filter1>
>   - *  <filter2 class="org.apache.log4j.filter.StringMatchFilter">
>   + *  </filter>
>   + *  <filter class="org.apache.log4j.filter.StringMatchFilter">
>     *        <param name="stringToMatch" value="test" />
>     *        <param name="acceptOnMatch" value="true" />
>   - *  </filter2>
>   + *  </filter>
>     *  <param name="acceptOnMatch" value="false"/>
>     * </filter>
>     * <filter class="org.apache.log4j.filter.DenyAllFilter"/>
>   @@ -64,24 +67,17 @@
>     * @author Scott Deboy [EMAIL PROTECTED]
>     */
>    public class AndFilter extends Filter {
>   -  Filter filter1;
>   -  Filter filter2;
>   +  List filters = new ArrayList();
>      boolean acceptOnMatch = true;
>
>      public void activateOptions() {
>        //nothing to do
>      }
>
>   -  public void setFilter1(Filter filter1) {
>   -    System.out.println("filter 1 set to: " + filter1);
>   -    this.filter1 = filter1;
>   +  public void addFilter(Filter filter) {
>   +    filters.add(filter);
>      }
>
>   -  public void setFilter2(Filter filter2) {
>   -    System.out.println("filter 2 set to: " + filter2);
>   -    this.filter2 = filter2;
>   -  }
>   -
>      public void setAcceptOnMatch(boolean acceptOnMatch) {
>        this.acceptOnMatch = acceptOnMatch;
>      }
>   @@ -95,14 +91,18 @@
>       * Returns [EMAIL PROTECTED] Filter#NEUTRAL}
>       */
>      public int decide(LoggingEvent event) {
>   -    if ((Filter.ACCEPT == filter1.decide(event)) &&
>   -        Filter.ACCEPT == filter2.decide(event)) {
>   +    boolean accepted = true;
>   +    for (Iterator iter = filters.iterator(); iter.hasNext();) {
>   +      Filter thisFilter = (Filter)iter.next();
>   +      accepted = accepted && (Filter.ACCEPT == thisFilter.decide(event));
>   +    }
>   +
>   +    if (accepted) {
>          if(acceptOnMatch) {
>            return Filter.ACCEPT;
>          }
>           return Filter.DENY;
>        }
>   -//    System.out.println("neutral: " + event.getLevel() + ".." + 
> event.getMessage());
>        return Filter.NEUTRAL;
>      }
>    }
>
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]

-- 
Ceki Gülcü

   The complete log4j manual: http://www.qos.ch/log4j/



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




<<winmail.dat>>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to