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 >> > [EMAIL PROTECTED] >> > 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: [EMAIL PROTECTED] >> > For additional commands, e-mail: [EMAIL PROTECTED] >> >> -- >> Jeffrey & Nikole Bonevich >> Maxmillian Bonevich >> Ann Arbor, Michigan >> [EMAIL PROTECTED] >> http://www.bonevich.com >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] > >-- >Jeffrey Bonevich >Ann Arbor, Michigan >[EMAIL PROTECTED] >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: [EMAIL PROTECTED] >For additional commands, e-mail: [EMAIL PROTECTED] -- Ceki Gülcü --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]