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 Paul Glezen <pg...@us.ibm.com> on 2001/06/26 17:46:01 UTC

Re: cvs commit: jakarta-log4j/src/java/org/apache/log4j/net SocketNode.java

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


Re: cvs commit: jakarta-log4j/src/java/org/apache/log4j/net SocketNode.java

Posted by Ceki Gülcü <cg...@qos.ch>.
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