You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by Ceki Gülcü <cg...@qos.ch> on 2001/06/26 18:12:18 UTC
Re: cvs commit: jakarta-log4j/src/java/org/apache/log4j/net
SocketNode.java
Paul,
Ooops. Thanks for refreshening my memory. I'll backtrack. Ceki
At 08:46 26.06.2001 -0700, you wrote:
>Ceki,
>
>I'm not sure you want to do this. Recall the mess about 6 months ago with
>subclasses of Category not able to provide the method name in log
>statements. The problem is the following. When the LocationInfo object
>tries to glean the application method name from the stack, the stack looks
>something like this.
>
> ...
> 6 org.apache.log4j.PatternLayout.format
> 5 org.apache.log4j.FileAppender.doAppend
> 4 org.apache.log4j.Category.callAppenders
> 3 org.apache.log4j.Category.forcedLog
> 2 org.apache.log4j.Category.warn
> 1 com.mycompany.myclass.myMethodCallingLog4j
> ...
>
>When Category is subclassed, entries 2 or 3 or both or none may be
>overridden by the subclass. In the AppServerCategory factory example,
>forcedLog is overridden. But I don't want the AppServerCategory FQCN
>passed into the LoggingEvent class. Otherwise the %M of PatternLayout will
>say "Category.warn" rather than myclass.myethodCallingLog4j.
>
>You were the one who discovered the delicate solution that worked for all
>four cases (2, 3, 2 and 3, neither). This was to always make the FQCN a
>private static of Category and the subclass with no accessors. I'm pretty
>sure the protected getFQCN will break this (if subclasses override getFQCN
>()).
>
>- Paul
>
>Paul Glezen
>IT Specialist
>Software Services for WebSphere
>818 539 3321
>
>
>ceki@apache.org on 06/26/2001 03:52:40 AM
>
>Please respond to "LOG4J Developers Mailing List"
> <lo...@jakarta.apache.org>
>
>To: jakarta-log4j-cvs@apache.org
>cc:
>Subject: cvs commit: jakarta-log4j/src/java/org/apache/log4j/net
> SocketNode.java
>
>
>
>ceki 01/06/26 03:52:38
>
> Modified: src/java/org/apache/log4j Category.java
> src/java/org/apache/log4j/examples Makefile MyCategory.java
> src/java/org/apache/log4j/helpers VersionHelper.java
> VersionHelper11.java VersionHelper20.java
> src/java/org/apache/log4j/net SocketNode.java
> Log:
> - Added the protected access getFQCN() method to Category class. The new
>method is used
> extensively. Subclasses of category should override this method.
>
> - Modified the MyCategory example to be easier to understand.
>
> - Changed indentation of VersionHelper*
>
> Revision Changes Path
> 1.32 +31 -17
>jakarta-log4j/src/java/org/apache/log4j/Category.java
>
> Index: Category.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-log4j/src/java/org/apache/log4j/Category.java,v
> retrieving revision 1.31
> retrieving revision 1.32
> diff -u -r1.31 -r1.32
> --- Category.java 2001/06/23 08:49:22 1.31
> +++ Category.java 2001/06/26 10:51:42 1.32
> @@ -167,9 +167,9 @@
> volatile protected Category parent;
>
> /**
> - The fully qualified name of the class that this Category
> - object. Subclasses should create their own private FQCN
> - variable. */
> + The fully qualified name of the Category class. See also the
> + getSubclasses should
> + create their own private FQCN variable. */
> private static final String FQCN = Category.class.getName();
>
> protected ResourceBundle resourceBundle;
> @@ -310,7 +310,7 @@
> if(hierarchy.disable >= Priority.DEBUG_INT)
> return;
> if(Priority.DEBUG.isGreaterOrEqual(this.getChainedPriority())) {
> - forcedLog(FQCN, Priority.DEBUG, message, null);
> + forcedLog(getFQCN(), Priority.DEBUG, message, null);
> }
> }
>
> @@ -328,7 +328,7 @@
> void debug(Object message, Throwable t) {
> if(hierarchy.disable >= Priority.DEBUG_INT) return;
> if(this.isEnabledFor(Priority.DEBUG))
> - forcedLog(FQCN, Priority.DEBUG, message, t);
> + forcedLog(getFQCN(), Priority.DEBUG, message, t);
> }
>
> //public
> @@ -362,7 +362,7 @@
> void error(Object message) {
> if(hierarchy.disable >= Priority.ERROR_INT) return;
> if(this.isEnabledFor(Priority.ERROR))
> - forcedLog(FQCN, Priority.ERROR, message, null);
> + forcedLog(getFQCN(), Priority.ERROR, message, null);
> }
>
> /**
> @@ -378,7 +378,7 @@
> void error(Object message, Throwable t) {
> if(hierarchy.disable >= Priority.ERROR_INT) return;
> if(this.isEnabledFor(Priority.ERROR))
> - forcedLog(FQCN, Priority.ERROR, message, t);
> + forcedLog(getFQCN(), Priority.ERROR, message, t);
>
> }
>
> @@ -418,7 +418,7 @@
> void fatal(Object message) {
> if(hierarchy.disable >= Priority.FATAL_INT) return;
> if(Priority.FATAL.isGreaterOrEqual(this.getChainedPriority()))
> - forcedLog(FQCN, Priority.FATAL, message, null);
> + forcedLog(getFQCN(), Priority.FATAL, message, null);
> }
>
> /**
> @@ -434,7 +434,7 @@
> void fatal(Object message, Throwable t) {
> if(hierarchy.disable >= Priority.FATAL_INT) return;
> if(Priority.FATAL.isGreaterOrEqual(this.getChainedPriority()))
> - forcedLog(FQCN, Priority.FATAL, message, t);
> + forcedLog(getFQCN(), Priority.FATAL, message, t);
> }
>
>
> @@ -526,6 +526,20 @@
> return defaultHierarchy;
> }
>
> +
> + /**
> + The value returned by this method is used as a hint to determine
> + the correct caller localization information.
> +
> + <p>Subclasses should override this method to return their own
> + fully qualified class name.
> +
> + @since 1.2 */
> + protected
> + String getFQCN() {
> + return Category.FQCN;
> + }
> +
>
> /**
> Return the the {@link Hierarchy} where this <code>Category</code>
>instance is
> @@ -702,7 +716,7 @@
> void info(Object message) {
> if(hierarchy.disable >= Priority.INFO_INT) return;
> if(Priority.INFO.isGreaterOrEqual(this.getChainedPriority()))
> - forcedLog(FQCN, Priority.INFO, message, null);
> + forcedLog(getFQCN(), Priority.INFO, message, null);
> }
>
> /**
> @@ -718,7 +732,7 @@
> void info(Object message, Throwable t) {
> if(hierarchy.disable >= Priority.INFO_INT) return;
> if(Priority.INFO.isGreaterOrEqual(this.getChainedPriority()))
> - forcedLog(FQCN, Priority.INFO, message, t);
> + forcedLog(getFQCN(), Priority.INFO, message, t);
> }
>
> /**
> @@ -813,7 +827,7 @@
> if(msg == null) {
> msg = key;
> }
> - forcedLog(FQCN, priority, msg, t);
> + forcedLog(getFQCN(), priority, msg, t);
> }
> }
> /**
> @@ -837,7 +851,7 @@
> msg = key;
> else
> msg = java.text.MessageFormat.format(pattern, params);
> - forcedLog(FQCN, priority, msg, t);
> + forcedLog(getFQCN(), priority, msg, t);
> }
> }
>
> @@ -850,7 +864,7 @@
> return;
> }
> if(priority.isGreaterOrEqual(this.getChainedPriority()))
> - forcedLog(FQCN, priority, message, t);
> + forcedLog(getFQCN(), priority, message, t);
> }
>
> /**
> @@ -862,7 +876,7 @@
> return;
> }
> if(priority.isGreaterOrEqual(this.getChainedPriority()))
> - forcedLog(FQCN, priority, message, null);
> + forcedLog(getFQCN(), priority, message, null);
> }
>
> /**
> @@ -1010,7 +1024,7 @@
> public
> void warn(Object message) {
> if(this.isEnabledFor(Priority.WARN))
> - forcedLog(FQCN, Priority.WARN, message, null);
> + forcedLog(getFQCN(), Priority.WARN, message, null);
> }
>
> /**
> @@ -1025,6 +1039,6 @@
> public
> void warn(Object message, Throwable t) {
> if(this.isEnabledFor(Priority.WARN))
> - forcedLog(FQCN, Priority.WARN, message, t);
> + forcedLog(getFQCN(), Priority.WARN, message, t);
> }
> }
>
>
>
> 1.5 +1 -0
>jakarta-log4j/src/java/org/apache/log4j/examples/Makefile
>
> Index: Makefile
> ===================================================================
> RCS file:
>/home/cvs/jakarta-log4j/src/java/org/apache/log4j/examples/Makefile,v
> retrieving revision 1.4
> retrieving revision 1.5
> diff -u -r1.4 -r1.5
> --- Makefile 2001/03/21 21:33:57 1.4
> +++ Makefile 2001/06/26 10:51:54 1.5
> @@ -7,6 +7,7 @@
> MyPatternParser.java\
> MyPatternLayout.java\
> MyCategory.java\
> + MyCategoryTest.java\
> MyCategoryFactory.java\
>
>
>
>
>
> 1.9 +17 -58
>jakarta-log4j/src/java/org/apache/log4j/examples/MyCategory.java
>
> Index: MyCategory.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-log4j/src/java/org/apache/log4j/examples/MyCategory.java,v
>
> retrieving revision 1.8
> retrieving revision 1.9
> diff -u -r1.8 -r1.9
> --- MyCategory.java 2001/06/06 16:07:16 1.8
> +++ MyCategory.java 2001/06/26 10:51:56 1.9
> @@ -17,71 +17,24 @@
> /**
> A simple example showing category subclassing.
>
> - <p>The example should make it clear that subclasses follow the
> - hierarchy. You should also try running this example with a <a
> - href="doc-files/mycat.bad">bad</a> and <a
> - href="doc-files/mycat.good">good</a> configuration file samples.
> + <p>See <b><a href="doc-files/MyCategory.java">source code</a></b>
> + for more details.
>
> - <p>See <b><a
> - href="doc-files/MyCategory.java">source code</a></b> for more
>details.
> + <p>See {@link MyCategoryTest} for a usage example.
>
> */
> public class MyCategory extends Category {
>
> - private static String FQCN = MyCategory.class.getName();
> + // It's usually a good idea to add a dot suffix to the fully
> + // qualified class name. This makes caller localization to work
> + // properly even from classes that match MyCategory such as
> + // MyCategoryTest.
> + static String FQCN = MyCategory.class.getName() + ".";
>
> // It's enough to instantiate a factory once and for all.
> private static MyCategoryFactory myFactory = new MyCategoryFactory();
>
> /**
> - When called wihtout arguments, this program will just print
> - <pre>
> - DEBUG [main] some.cat - Hello world.
> - </pre>
> - and exit.
> -
> - <b>However, it can be called with a configuration file in XML or
> - properties format.
> -
> - */
> - static public void main(String[] args) {
> -
> - if(args.length == 0) {
> - // Note that the appender is added to root but that the log
> - // request is made to an instance of MyCategory. The output still
> - // goes to System.out.
> - Category root = Category.getRoot();
> - Layout layout = new PatternLayout("%p [%t] %c - %m%n");
> - root.addAppender(new ConsoleAppender(layout,
>ConsoleAppender.SYSTEM_OUT));
> - }
> - else if(args.length == 1) {
> - if(args[0].endsWith("xml")) {
> - DOMConfigurator.configure(args[0]);
> - } else {
> - PropertyConfigurator.configure(args[0]);
> - }
> - } else {
> - usage("Incorrect number of parameters.");
> - }
> - try {
> - MyCategory c = (MyCategory) MyCategory.getInstance("some.cat");
> - c.trace("Hello");
> - c.debug("Hello");
> - } catch(ClassCastException e) {
> - LogLog.error("Did you forget to set the factory in the config
>file?", e);
> - }
> - }
> -
> - static
> - void usage(String errMsg) {
> - System.err.println(errMsg);
> - System.err.println("\nUsage: "+MyCategory.class.getName() +
>"[configFile]\n"
> - + " where *configFile* is an optional configuration
>file, "+
> - "either in properties or XML format.");
> - System.exit(1);
> - }
> -
> - /**
> Just calls the parent constuctor.
> */
> public MyCategory(String name) {
> @@ -92,9 +45,15 @@
> Overrides the standard debug method by appending " world" at the
> end of each message. */
> public
> - void debug(String message) {
> + void debug(Object message) {
> super.debug(message + " world.");
> }
> +
> + protected
> + String getFQCN() {
> + return MyCategory.FQCN;
> + }
> +
>
> /**
> This method overrides {@link Category#getInstance} by supplying
> @@ -107,8 +66,8 @@
> }
>
> public
> - void trace(String message) {
> - super.log(XPriority.TRACE, message);
> + void trace(Object message) {
> + super.log(XPriority.TRACE, message);
> }
> }
>
>
>
>
> 1.2 +55 -49
>jakarta-log4j/src/java/org/apache/log4j/helpers/VersionHelper.java
>
> Index: VersionHelper.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-log4j/src/java/org/apache/log4j/helpers/VersionHelper.java,v
>
> retrieving revision 1.1
> retrieving revision 1.2
> diff -u -r1.1 -r1.2
> --- VersionHelper.java 2001/06/20 07:59:47 1.1
> +++ VersionHelper.java 2001/06/26 10:52:09 1.2
> @@ -11,61 +11,67 @@
> import java.util.StringTokenizer;
>
> /**
> - VersionHelper fixes the classloading trouble when using Log4J in a
>multi-classloader
> - environment like Jakarta Tomcat
> + VersionHelper fixes the classloading trouble when using Log4J in a
> + multi-classloader environment like Jakarta Tomcat
>
> @since 1.2
> - @author Christopher Taylor
> -*/
> + @author Christopher Taylor */
> abstract public class VersionHelper {
>
> - public static final String VERSION_PROPERTY = "java.version";
> - private static VersionHelper helper;
> + public static final String VERSION_PROPERTY = "java.version";
> + private static VersionHelper helper;
>
>
> - /** VersionHelpers for specific JVM versions override this method,
>For example, VersionHelper11 just calls
> - * into <code>Class.forName()</code>, while VersionHelper20 calls
>into
> - * <code>Thread.currentThread().getContextClassLoader().loadClass
>()</code>
> - * @see java.lang.Thread#getContextClassLoader
> - */
> - abstract public Class loadClass (String klass_name) throws
>ClassNotFoundException;
> + /** VersionHelpers for specific JVM versions override this method,
> + * For example, VersionHelper11 just calls into
> + * <code>Class.forName()</code>, while VersionHelper20 calls into
> + * <code>Thread.currentThread().getContextClassLoader().loadClass
>()</code>
> + * @see java.lang.Thread#getContextClassLoader */
> +
> +
> + abstract public Class loadClass (String klass_name) throws
>ClassNotFoundException;
>
> - /** All classes in Log4J that need to dynamically load other classes
>must use
> - * <code>org.apache.log4j.helpers.VersionHelper.getInstance
>().loadClass(<i>class name</i>)</code>
> - * and <b>not</b> use <code>Class.forName</code>. In a Java 2
>environment, classes from a parent
> - * classloader will ignore any classes available in child class
>loaders. Consequently, any appenders,
> - * layout managers, or other supporting Log4J classes that are not
>bundled with the main <code>log4j.jar</code>
> - * file will be ignored in a multi-classloader environment like Tomcat
>unless a call is made to
> - * <code>Thread.currentThread().getContextClassLoader
>().loadClass</code>. As this method is only in Java 2,
> - * special version checking code must be inserted guaranteeing that it
>won't be executed on Java 1 platforms.
> - * The VersionHelper superclass handles the version checking within
>this method by parsing the System property
> - * <code>java.version</code>.
> - * @see java.lang.Thread#getContextClassLoader
> - */
> - public static VersionHelper getInstance () {
> - if (helper == null) {
> - /* If the helper is null, we'll inspect the System property
>"java.version" and
> - figure out which version of the VM we're running on.
> - Version strings are: [major version].[minor version].[bug
>fix revision]
> - So JDK 1.2: 1.2.0
> - JDK 1.1: 1.1.0
> - */
> - String prop = System.getProperty(VERSION_PROPERTY);
> - StringTokenizer st = new StringTokenizer(prop,".");
> - st.nextToken(); // Ignore the initial 1
> - String version = st.nextToken();
> - try {
> - /* Here we'll parse the number and decide which version
>helper to use */
> - switch (Integer.parseInt(version)) {
> - case 0:
> - case 1: helper = new VersionHelper11(); break;
> - default: helper = new VersionHelper20(); break;
> - }
> - }
> - catch (NumberFormatException oops) {
> - helper = new VersionHelper11();
> - }
> - }
> - return helper;
> + /** All classes in Log4J that need to dynamically load other classes
> + * must use
> + * <code>org.apache.log4j.helpers.VersionHelper.getInstance
>().loadClass(<i>class
> + * name</i>)</code> and <b>not</b> use <code>Class.forName</code>.
> + * In a Java 2 environment, classes from a parent classloader will
> + * ignore any classes available in child class loaders.
> + * Consequently, any appenders, layout managers, or other supporting
> + * Log4J classes that are not bundled with the main
> + * <code>log4j.jar</code> file will be ignored in a
> + * multi-classloader environment like Tomcat unless a call is made
> + * to
> + * <code>Thread.currentThread().getContextClassLoader
>().loadClass</code>.
> + * As this method is only in Java 2, special version checking code
> + * must be inserted guaranteeing that it won't be executed on Java 1
> + * platforms. The VersionHelper superclass handles the version
> + * checking within this method by parsing the System property
> + * <code>java.version</code>.
> + * @see java.lang.Thread#getContextClassLoader */
> + public static VersionHelper getInstance () {
> + if (helper == null) {
> + /* If the helper is null, we'll inspect the System property
>"java.version" and
> + figure out which version of the VM we're running on.
> + Version strings are: [major version].[minor version].[bug fix
>revision]
> + So JDK 1.2: 1.2.0
> + JDK 1.1: 1.1.0
> + */
> + String prop = System.getProperty(VERSION_PROPERTY);
> + StringTokenizer st = new StringTokenizer(prop,".");
> + st.nextToken(); // Ignore the initial 1
> + String version = st.nextToken();
> + try {
> + /* Here we'll parse the number and decide which version helper to use
>*/
> + switch (Integer.parseInt(version)) {
> + case 0:
> + case 1: helper = new VersionHelper11(); break;
> + default: helper = new VersionHelper20(); break;
> }
> + } catch (NumberFormatException oops) {
> + helper = new VersionHelper11();
> + }
> + }
> + return helper;
> + }
> }
>
>
>
> 1.2 +7 -7
>jakarta-log4j/src/java/org/apache/log4j/helpers/VersionHelper11.java
>
> Index: VersionHelper11.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-log4j/src/java/org/apache/log4j/helpers/VersionHelper11.java,v
>
> retrieving revision 1.1
> retrieving revision 1.2
> diff -u -r1.1 -r1.2
> --- VersionHelper11.java 2001/06/20 07:59:47 1.1
> +++ VersionHelper11.java 2001/06/26 10:52:12 1.2
> @@ -9,12 +9,12 @@
> package org.apache.log4j.helpers;
>
> /** VersionHelper11 is the Java 1 compatible VersionHelper for
>classloading
> - * @since 1.2
> - * @see org.apache.log4j.helpers.VersionHelper
> - * @author Christopher Taylor
> - */
> + * @since 1.2
> + * @see org.apache.log4j.helpers.VersionHelper
> + * @author Christopher Taylor
> + */
> public class VersionHelper11 extends VersionHelper {
> - public Class loadClass (String klass_name) throws
>ClassNotFoundException {
> - return Class.forName(klass_name);
> - }
> + public Class loadClass (String klass_name) throws
>ClassNotFoundException {
> + return Class.forName(klass_name);
> + }
> }
>
>
>
> 1.2 +8 -8
>jakarta-log4j/src/java/org/apache/log4j/helpers/VersionHelper20.java
>
> Index: VersionHelper20.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-log4j/src/java/org/apache/log4j/helpers/VersionHelper20.java,v
>
> retrieving revision 1.1
> retrieving revision 1.2
> diff -u -r1.1 -r1.2
> --- VersionHelper20.java 2001/06/20 07:59:47 1.1
> +++ VersionHelper20.java 2001/06/26 10:52:15 1.2
> @@ -7,14 +7,14 @@
> */
> package org.apache.log4j.helpers;
>
> - /** VersionHelper20 is the Java 2 compatible VersionHelper for
>classloading
> - * @since 1.2
> - * @see org.apache.log4j.helpers.VersionHelper
> - * @author Christopher Taylor
> - */
> +/** VersionHelper20 is the Java 2 compatible VersionHelper for
>classloading
> + * @since 1.2
> + * @see org.apache.log4j.helpers.VersionHelper
> + * @author Christopher Taylor
> + */
> public class VersionHelper20 extends VersionHelper {
> - public Class loadClass (String klass_name) throws
>ClassNotFoundException {
> - return Thread.currentThread().getContextClassLoader
>().loadClass(klass_name);
> - }
> + public Class loadClass (String klass_name) throws
>ClassNotFoundException {
> + return Thread.currentThread().getContextClassLoader
>().loadClass(klass_name);
> + }
> }
>
>
>
>
> 1.8 +4 -1
>jakarta-log4j/src/java/org/apache/log4j/net/SocketNode.java
>
> Index: SocketNode.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-log4j/src/java/org/apache/log4j/net/SocketNode.java,v
> retrieving revision 1.7
> retrieving revision 1.8
> diff -u -r1.7 -r1.8
> --- SocketNode.java 2001/06/21 17:51:44 1.7
> +++ SocketNode.java 2001/06/26 10:52:30 1.8
> @@ -80,8 +80,11 @@
> cat.info("Caught java.io.EOFException closing conneciton.");
> } catch(java.net.SocketException e) {
> cat.info("Caught java.net.SocketException closing conneciton.");
> + } catch(IOException e) {
> + cat.info("Caught java.io.IOException: "+e);
> + cat.info("Closing connection.");
> } catch(Exception e) {
> - cat.warn("Unexpected exception. Closing conneciton.", e);
> + cat.error("Unexpected exception. Closing conneciton.", e);
> }
>
> try {
>
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: log4j-cvs-unsubscribe@jakarta.apache.org
>For additional commands, e-mail: log4j-cvs-help@jakarta.apache.org
>
>
>
>
>---------------------------------------------------------------------
>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