[prev in list] [next in list] [prev in thread] [next in thread] 

List:       log4j-dev
Subject:    Re: [PATCH] Add handling of custom Priority subclasses to
From:       Ceki =?iso-8859-1?Q?G=FClc=FC?= <cgu () qos ! ch>
Date:       2001-05-20 14:05:33
[Download RAW message or body]


Hi again,

Double checking on myself I found out that the support for custom priorities was \
somehow missing in PropertyConfigurator even if the HISTORY file indicated otherwise. \
This is not corrected in the latest code, future 1.1.1) I also added a related test \
case. Regards, Ceki


At 14:41 20.05.2001 +0200, you wrote:

> This is from the HISTORY file:
> 
> April 18, 2001
> 
> - Release of version 1.1b2
> 
> ... removed stuff
> 
> - Whenever a priority parameter is expected in a configuration file,
> one can now use a custom priority class. See OptionConverter.toPriority
> method for more information. Note that the <priority> element in
> log4j.dtd remains unaffected by this change. [*]
> 
> I am updating PropertyConfigurator documentation to reflect the new feature.
> 
> Consequently, there is no need to apply your patch since the feature you request is \
> already supported. Regards, Ceki 
> 
> 
> At 22:35 19.05.2001 -0400, you wrote:
> > Still have heard nothing on this.  Just pestering.  Please let me know
> > if this is acceptable or if more info/testing is necessary.  Thanx!
> > 
> > jeff
> > 
> > Jeffrey Bonevich wrote:
> > > 
> > > Have received no comment on this one in a week.  Problems?  Maybe
> > > already covered by another patch?  Please inform.  Thanx!
> > > 
> > > jeff
> > > 
> > > Jeffrey Bonevich wrote:
> > > > 
> > > > I was finding it quite frustrating that PropertyConfigurator could not
> > > > handle the advanced feature handled in DOMConfigurator, namely allowing
> > > > the use of custom extensions of the Priority class.  I am unable to use
> > > > DOMConfigurator currently in my apps because I rely on some older
> > > > versions of the XML libraries and am bound to those for the near
> > > > future.
> > > > 
> > > > See the attached for a cvs diff.  Borrowed a lot of code/ideas for this
> > > > from DOMConfigurator.  I have tested this using the attached classes
> > > > (test_PropertyConfigurator.java and test_Priority.java) and config file.
> > > > 
> > > > Please let me know if there is any additional info needed.  I will be
> > > > happy to discuss this further as well.
> > > > 
> > > > jeff
> > > > 
> > > > --
> > > > Jeffrey & Nikole Bonevich
> > > > Maxmillian Bonevich
> > > > Ann Arbor, Michigan
> > > > bonevich@telocity.com
> > > > http://www.bonevich.com
> > > > 
> > > > ------------------------------------------------------------------------
> > > > Index: PropertyConfigurator.java
> > > > ===================================================================
> > > > RCS file: /home/cvspublic/jakarta-log4j/src/java/org/apache/log4j/PropertyConfigurator.java,v
> > > >  retrieving revision 1.18
> > > > diff -u -r1.18 PropertyConfigurator.java
> > > > --- PropertyConfigurator.java   2001/03/20 16:05:35     1.18
> > > > +++ PropertyConfigurator.java   2001/04/15 03:27:38
> > > > @@ -33,6 +33,7 @@
> > > > import java.io.IOException;
> > > > import java.util.StringTokenizer;
> > > > import java.util.Hashtable;
> > > > +import java.lang.reflect.Method;
> > > > 
> > > > /**
> > > > Extends {@link BasicConfigurator} to provide configuration from an
> > > > @@ -52,7 +53,7 @@
> > > > <p>The <code>PropertyConfigurator</code> does not handle the
> > > > advanced configuration features supported by the {@link
> > > > org.apache.log4j.xml.DOMConfigurator DOMConfigurator} such as support for
> > > > -   sub-classing of the Priority class, {@link org.apache.log4j.spi.Filter
> > > > +   {@link org.apache.log4j.spi.Filter
> > > > Filters}, custom {@link org.apache.log4j.spi.ErrorHandler ErrorHandlers},
> > > > nested appenders such as the {@link org.apache.log4j.AsyncAppender
> > > > AsyncAppender}, etc.
> > > > @@ -91,11 +92,17 @@
> > > > static final String ADDITIVITY_PREFIX = "log4j.additivity.";
> > > > static final String ROOT_CATEGORY_PREFIX = "log4j.rootCategory";
> > > > static final String APPENDER_PREFIX = "log4j.appender.";
> > > > +  static final String PRIORITY_PREFIX = "log4j.priority.";
> > > > static final String RENDERER_PREFIX = "log4j.renderer.";
> > > > static final String CATEGORY_FACTORY_KEY = "log4j.categoryFactory";
> > > > 
> > > > static final private String INTERNAL_ROOT_NAME = "root";
> > > > +  static final private String EXTERNAL_ROOT_NAME = "rootCategory";
> > > > 
> > > > +  static final private String TO_PRIORITY_METHOD = "toPriority";
> > > > +  static final Class[] ONE_STRING_PARAM = new Class[] {String.class};
> > > > +  static final private String EMPTY_STR = "";
> > > > +
> > > > /**
> > > > Read configuration from a file. The existing configuration is not
> > > > cleared nor reset. If you require a different call, behaviour,
> > > > @@ -133,15 +140,18 @@
> > > > 
> > > > <p>The syntax for configuring the root category is:
> > > > <pre>
> > > > -      log4j.rootCategory=[FATAL|ERROR|WARN|INFO|DEBUG], appenderName, \
> > > > appenderName, ... +      \
> > > > log4j.rootCategory=[FATAL|ERROR|WARN|INFO|DEBUG|other valid priority], \
> > > > appenderName, appenderName, ... +      \
> > > > log4j.priority.rootCategory=fully.qualified.name.of.Priority.subclass </pre>
> > > > 
> > > > -    <p>This syntax means that one of the strings values ERROR, WARN,
> > > > -    INFO or DEBUG can be supplied followed by appender names separated
> > > > -    by commas.
> > > > +    <p>This syntax means that one of the string values ERROR, WARN,
> > > > +    INFO, DEBUG, or some other priority value for the subclass of
> > > > +       Priority that you have chosen (specified by the priority
> > > > +       property above), can be supplied followed by appender names
> > > > +       separated by commas.
> > > > 
> > > > -    <p>If one of the optional priority values ERROR, WARN, INFO or
> > > > -    DEBUG is given, the root priority is set to the corresponding
> > > > +    <p>If one of the optional priority values (i.e. ERROR, WARN, INFO,
> > > > +    DEBUG, etc.) is given, the root priority is set to the corresponding
> > > > priority.  If no priority value is specified, then the root
> > > > priority remains untouched.
> > > > 
> > > > @@ -546,9 +556,35 @@
> > > > // root category.
> > > > if(priorityStr.equalsIgnoreCase(BasicConfigurator.INHERITED) &&
> > > > !catName.equals(INTERNAL_ROOT_NAME))
> > > > -       cat.setPriority(null);
> > > > -      else
> > > > -       cat.setPriority(Priority.toPriority(priorityStr));
> > > > +      {
> > > > +        cat.setPriority(null);
> > > > +      } else {
> > > > +        // See if we have a priority subclass
> > > > +        String catNameFixed = catName.equals(INTERNAL_ROOT_NAME)
> > > > +          ? EXTERNAL_ROOT_NAME : catName;
> > > > +        String className = props.getProperty(PRIORITY_PREFIX + \
> > > > catNameFixed); +
> > > > +        if (className!=null && !className.equals(EMPTY_STR))
> > > > +        {
> > > > +          try {
> > > > +            Class priorityClass = Class.forName(className);
> > > > +            // Cannot instantiate Priority directly - use toProperty method
> > > > +            Method toPriorityMethod = priorityClass.getMethod(
> > > > +              TO_PRIORITY_METHOD, ONE_STRING_PARAM
> > > > +            );
> > > > +            Priority priorityObj = (Priority)toPriorityMethod.invoke(
> > > > +              null, new Object[] {priorityStr}
> > > > +            );
> > > > +            cat.setPriority(priorityObj);
> > > > +          } catch(Exception e) {
> > > > +            LogLog.error("Could not create priority ["+priorityStr+
> > > > +                      "] on Priority subclass '" + className + "'. Reported \
> > > > error follows.", e); +          }
> > > > +        } else {
> > > > +          cat.setPriority(Priority.toPriority(priorityStr));
> > > > +        }
> > > > +      }
> > > > +
> > > > LogLog.debug("Category " + catName + " set to " + cat.getPriority());
> > > > }
> > > > 
> > > > 
> > > > ------------------------------------------------------------------------
> > > > import org.apache.log4j.*;
> > > > 
> > > > public class test_PropertyConfigurator
> > > > {
> > > > public static void main(String[] args)
> > > > {
> > > > PropertyConfigurator.configure("/home/jbonevic/jakarta-log4j/dist/classes/log4j_test.properties");
> > > >  Category root = Category.getRoot();
> > > > Category cat1 = Category.getInstance("test1");
> > > > Category cat2 = Category.getInstance("test2");
> > > > 
> > > > Priority rootPri = root.getPriority();
> > > > Priority cat1Pri = cat1.getPriority();
> > > > Priority cat2Pri = cat2.getPriority();
> > > > System.out.println("root category = " + rootPri.toString() + " [" + \
> > > > rootPri.getClass().getName() + "]"); System.out.println("cat1 category = " + \
> > > > cat1Pri.toString() + " [" + cat1Pri.getClass().getName() + "]"); \
> > > > System.out.println("cat2 category = " + cat2Pri.toString() + " [" + \
> > > > cat2Pri.getClass().getName() + "]"); System.out.println("");
> > > > 
> > > > root.log(test_Priority.TEST2,"This message came from root at TEST2!");
> > > > root.log(test_Priority.FATAL,"This message came from root at FATAL!");
> > > > root.log(test_Priority.DEBUG,"This message came from root at DEBUG!");
> > > > root.log(test_Priority.TEST1,"This message came from root at TEST1!");
> > > > 
> > > > cat1.log(test_Priority.TEST2,"This message came from cat1 at TEST2!");
> > > > cat1.log(test_Priority.FATAL,"This message came from cat1 at FATAL!");
> > > > cat1.log(test_Priority.DEBUG,"This message came from cat1 at DEBUG!");
> > > > cat1.log(test_Priority.TEST1,"This message came from cat1 at TEST1!");
> > > > 
> > > > cat2.log(Priority.FATAL,"This message came from cat2 at FATAL!");
> > > > cat2.log(Priority.WARN,"This message came from cat2 at WARN!");
> > > > cat2.log(Priority.DEBUG,"This message came from cat2 at DEBUG!");
> > > > }
> > > > }
> > > > 
> > > > ------------------------------------------------------------------------
> > > > import org.apache.log4j.Priority;
> > > > 
> > > > public class test_Priority extends Priority
> > > > {
> > > > public static final int TEST1_INT = 1000;
> > > > public static final int TEST2_INT = 100000;
> > > > public static final test_Priority TEST1 = new \
> > > > test_Priority(TEST1_INT,"TEST1",10); public static final test_Priority TEST2 \
> > > > = new test_Priority(TEST2_INT,"TEST2",0); 
> > > > protected test_Priority(int lvl, String name, int sysloglvl) {
> > > > super(lvl,name,sysloglvl);
> > > > }
> > > > 
> > > > public
> > > > static
> > > > Priority[] getAllPossiblePriorities() {
> > > > return new Priority[] {test_Priority.TEST2, test_Priority.FATAL, \
> > > > test_Priority.ERROR, test_Priority.WARN, test_Priority.INFO, \
> > > > test_Priority.DEBUG, test_Priority.TEST1}; }
> > > > 
> > > > public
> > > > static
> > > > Priority toPriority(int val) {
> > > > return toPriority(val,test_Priority.TEST1);
> > > > }
> > > > 
> > > > public
> > > > static
> > > > Priority toPriority(int val, Priority defaultPriority) {
> > > > switch(val) {
> > > > case TEST1_INT: return TEST1;
> > > > case DEBUG_INT: return DEBUG;
> > > > case INFO_INT: return INFO;
> > > > case WARN_INT: return WARN;
> > > > case ERROR_INT: return ERROR;
> > > > case FATAL_INT: return FATAL;
> > > > case TEST2_INT: return TEST2;
> > > > default: return defaultPriority;
> > > > }
> > > > }
> > > > 
> > > > public
> > > > static
> > > > Priority toPriority(String val) {
> > > > return toPriority(val,test_Priority.TEST1);
> > > > }
> > > > 
> > > > public
> > > > static
> > > > Priority toPriority(String sArg, Priority defaultPriority) {
> > > > if(sArg == null)
> > > > return defaultPriority;
> > > > 
> > > > String s = sArg.toUpperCase();
> > > > 
> > > > if(s.equals("TEST1")) return TEST1;
> > > > if(s.equals("DEBUG")) return DEBUG;
> > > > if(s.equals("INFO"))  return INFO;
> > > > if(s.equals("WARN"))  return WARN;
> > > > if(s.equals("ERROR")) return ERROR;
> > > > if(s.equals("FATAL")) return FATAL;
> > > > if(s.equals("TEST2")) return TEST2;
> > > > return defaultPriority;
> > > > }
> > > > }
> > > > 
> > > > ------------------------------------------------------------------------
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: log4j-dev-unsubscribe@jakarta.apache.org
> > > > For additional commands, e-mail: log4j-dev-help@jakarta.apache.org
> > > 
> > > --
> > > Jeffrey & Nikole Bonevich
> > > Maxmillian Bonevich
> > > Ann Arbor, Michigan
> > > bonevich@telocity.com
> > > http://www.bonevich.com
> > > 
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: log4j-dev-unsubscribe@jakarta.apache.org
> > > For additional commands, e-mail: log4j-dev-help@jakarta.apache.org
> > 
> > -- 
> > Jeffrey Bonevich
> > Ann Arbor, Michigan
> > bonevich@telocity.com
> > http://www.bonevich.com
> > 
> > Hwæt! Wë Gär-Dena   in geär-dagum,
> > peod-cyninga,       prym gefrünon,
> > hü ða aepelingas   ellen fremedon!
> > 
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: log4j-dev-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: log4j-dev-help@jakarta.apache.org
> 
> --
> Ceki Gülcü
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-dev-help@jakarta.apache.org

--
Ceki Gülcü


---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-dev-help@jakarta.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic