ceki        01/09/09 13:20:27

  Modified:    src/docbook architecture.xml manual.xml
  Log:
  The architecture chapter now cleanly "compiles".
  
  Revision  Changes    Path
  1.2       +632 -424  jakarta-log4j/src/docbook/architecture.xml
  
  Index: architecture.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/docbook/architecture.xml,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- architecture.xml  2001/09/08 17:57:38     1.1
  +++ architecture.xml  2001/09/09 20:20:26     1.2
  @@ -1,40 +1,42 @@
  -<chapter>
  +  <chapter>
       <title>Logger, Appenders and Layouts</title>
  -
  -    <para>Log4j has three main components: <em>loggers</em>,
  -      <em>appenders</em> and <em>layouts</em>. These three types of
  -      components work together to enable developers to log messages
  -      according to message type and priority, and to control at
  -      runtime how these messages are formatted and where they are
  -      reported.
  +    
  +    <para>Log4j has three main components:
  +      <emphasis>loggers</emphasis>, <emphasis>appenders</emphasis> and
  +      <emphasis>layouts</emphasis>. These three types of components
  +      work together to enable developers to log messages according to
  +      message type and priority, and to control at runtime how these
  +      messages are formatted and where they are reported.
       </para>
  -
  -    <sect1>Logger hierarchy</sect1>
       
  -    <para>The first and foremost advantage of any logging API over
  -      plain <function>System.out.println</function> resides in its
  -      ability to disable certain log statements while allowing others
  -      to print unhindered. This capability assumes that the logging
  -      space, that is, the space of all possible logging statements, is
  -      categorized according to some developer-chosen criteria. </para>
  -
  -    <para>This observation had previously led us to choose
  -      <emphasis>category</emphasis> as the central concept of the
  -      package. However, since log4j version 1.2, <ulink
  -      url="api/org/apache/log4j/Logger.html">Logger</ulink>
  -      <classname>Logger</classname> class has replaced the
  -      <classname>Category</classname> class.
  -
  +    <sect1>
  +      <title>Logger hierarchy</title>
         
  -      <para>Loggers are named entities. Logger names are
  -      case-sensitive and they follow the hierarchical naming rule:
  +      <para>The first and foremost advantage of any logging API over
  +     plain <function>System.out.println</function> resides in its
  +     ability to disable certain log statements while allowing others
  +     to print unhindered. This capability assumes that the logging
  +     space, that is, the space of all possible logging statements, is
  +     categorized according to some developer-chosen criteria. </para>
  +      
  +      <para>This observation had previously led us to choose
  +     <emphasis>category</emphasis> as the central concept of the
  +     package. However, since log4j version 1.2, <ulink
  +       url="api/org/apache/log4j/Logger.html">Logger</ulink>
  +     <classname>Logger</classname> class has replaced the
  +     <classname>Category</classname> class.
         </para>
        
  +     
  +      <para>Loggers are named entities. Logger names are
  +     case-sensitive and they follow the hierarchical naming rule:
  +      </para>
  +      
         <para>
        <variablelist>
          <varlistentry>
  -         <term><emphasis rule="bold">Named Hierarchy Rule</emphasis></term>
  -
  +         <term><emphasis role="strong">Named Hierarchy Rule</emphasis></term>
  +         
            <listitem>
              <para>A category is said to be an
                <emphasis>ancestor</emphasis> of another category if
  @@ -49,424 +51,630 @@
          </varlistentry>
        </variablelist>
         </para>
  -    </para>
  -
  +      
   
  -<para>For example, the category named <code>"com.foo"</code> is a parent
  -of the category named <code>"com.foo.Bar"</code>.  Similarly,
  -<code>"java"</code> is a parent of <code>"java.util"</code> and an
  -ancestor of <code>"java.util.Vector"</code>.  This naming scheme
  -should be familiar to most developers.
  -
  -<para>The root category resides at the top of the category hierarchy. It
  -is exceptional in two ways: 
  -
  -<ol>
  -<li> it always exists,
  -<li> it cannot be retrieved by name. 
  -</ol>
  -<para>Invoking the class static <a
  -href="api/org/apache/log4j/Category.html#getRoot()">Category.getRoot</a>
  -method retrieves it. All other categories are instantiated and
  -retrieved with the class static <a
  -href="api/org/apache/log4j/Category.html#getRoot()">Category.getInstance</a>
  -method. This method takes the name of the desired category as a
  -parameter. Some of the basic methods in the Category class are listed
  -below.
  -
  -<para><table>
  -<tr bgcolor="CCCCCC">
  -<td>
  -<pre>
  -  package org.apache.log4j;
  +      <para>For example, the logger named
  +     <classname>"com.foo"</classname> is a parent of the category
  +     named <classname>"com.foo.Bar"</classname>.  Similarly,
  +     <classname>"java"</classname> is a parent of
  +     <classname>"java.util"</classname> and an ancestor of
  +     <classname>"java.util.Vector"</classname>.  This naming scheme
  +     should be familiar to most developers.
  +      </para>
  +      
  +      <para>The root logger resides at the top of the category
  +     hierarchy. It is exceptional in two ways:
  +      </para>
  +      
  +      <para>
  +     <itemizedlist>
  +       <listitem><para>it always exists,</para></listitem>
  +       <listitem><para>it cannot be retrieved by name.</para></listitem>
  +     </itemizedlist>
  +      </para>
  +      
  +      <para>Invoking the class static <ulink
  +       
url="../api/org/apache/log4j/Logger.html#getRootLogger()">Logger.getRootLogger</ulink>
  +     method retrieves it. All other logger are instantiated and
  +     retrieved with the class static <ulink
  +       url="../api/org/apache/log4j/Logger.html#geLogger()">Logger.getLogger</ulink>
  +     method. This method takes the name of the desired logger as a
  +     parameter. Some of the basic methods in the
  +     <classname>Logger</classname> class are listed below.
  +      </para>
  +      
  +      <para>
  +     
  +     <programlisting>
  +       package org.apache.log4j;
     
  -  public <b>Category</b> class {
  +     public <emphasis role="strong">Logger</emphasis> class {
     
  -    // Creation & retrieval methods:
  -    public static Category getRoot();
  -    public static Category getInstance(String name);
  -    
  -    // printing methods:
  -    public void debug(Object message);
  -    public void info(Object message);
  -    public void warn(Object message);
  -    public void error(Object message);
  -
  -    // generic printing method:
  -    public void log(Priority p, Object message);
  -}
  -</pre>
  -</td>
  -</table>
  -
  -<para>Categories <emphasis>may</emphasis> be assigned priorities. The set of 
possible
  -priorities, that is 
  -
  -<a href="api/org/apache/log4j/Priority.html#DEBUG">DEBUG</a>, 
  -<a href="api/org/apache/log4j/Priority.html#INFO">INFO</a>, 
  -<a href="api/org/apache/log4j/Priority.html#WARN">WARN</a>, 
  -<a href="api/org/apache/log4j/Priority.html#ERROR">ERROR</a> and 
  -<a href="api/org/apache/log4j/Priority.html#FATAL">FATAL</a> 
  -
  -are defined in the <code><a
  -href="api/org/apache/log4j/Priority.html">org.apache.log4j.Priority</a></code>
  -class. Although we do not encourage you from doing so, you may define
  -your own priorities by sub-classing the <code>Priority</code> class. A
  -perhaps better approach is will be explained later on.
  -
  -<para>If a given category is not assigned a priority, then it inherits
  -one from its closest ancestor with an assigned priority. More
  -formally:
  -
  -
  -<para>
  -<table bgcolor="#EEEE99">
  -  <tr>
  -  <td>  
  -   <dl>
  -     <dt><b>Priority Inheritance</b>
  -
  -     <dd><para>The <emphasis>inherited priority</emphasis> for a given category
  -<i>C</i>, is equal to the first non-null priority in the category
  -hierarchy, starting at <i>C</i> and proceeding upwards in the
  -hierarchy towards the <code>root</code> category.
  -
  -   </dl>
  -</table>
  -
  -<para>To ensure that all categories can eventually inherit a priority,
  -the root category always has an assigned priority.
  -
  -<para>Below are four tables with various assigned priority values and the
  -resulting inherited priorities according to the above rule.
  -
  -<para>
  -<table border="1" >
  -  <tr><th>Category<br>name</th><th>Assigned<br>priority</th>
  -    <th>Inherited<br>priority</th></tr>
  -    <tr align=left><td>root</td>    <td>Proot</td> <td>Proot</td></tr>
  -    <tr align=left><td>X </td>      <td>none</td>  <td>Proot</td></tr>
  -    <tr align=left><td>X.Y </td>    <td>none</td>  <td>Proot</td></tr>
  -    <tr align=left><td>X.Y.Z</td>   <td>none</td>  <td>Proot</td></tr>
  -    <caption align=bottom>Example 1</caption>    
  -</table>
  -
  -<para>In example 1 above, only the root category is assinged a
  -priority. This priority value, <code>Proot</code>, is inherited by the
  -other categories <code>X</code>, <code>X.Y</code> and
  -<code>X.Y.Z</code>.
  -
  -
  -<para>
  -<table border="1">
  -    <tr><th>Category<br>name</th><th>Assigned<br>priority</th>
  -    <th>Inherited<br>priority</th></tr>
  -    <tr align=left><td>root</td>    <td>Proot</td> <td>Proot</td></tr>
  -    <tr align=left><td>X </td>      <td>Px</td>    <td>Px</td></tr>
  -    <tr align=left><td>X.Y </td>    <td>Pxy</td>   <td>Pxy</td></tr>
  -    <tr align=left><td>X.Y.Z</td>   <td>Pxyz</td>  <td>Pxyz</td></tr>
  -    <caption align=bottom>Example 2</caption>
  -  </table>
  -
  -<para>In example 2, all categories have an assigned priority value. There
  -is no need for priority inheritence.
  -
  -<para><table border="1">
  -    <tr><th>Category<br>name</th><th>Assigned<br>priority</th>
  -    <th>Inherited<br>priority</th></tr>
  -    <tr align=left><td>root</td>    <td>Proot</td> <td>Proot</td></tr>
  -    <tr align=left><td>X </td>      <td>Px</td>    <td>Px</td></tr>
  -    <tr align=left><td>X.Y </td>    <td>none</td>  <td>Px</td></tr>
  -    <tr align=left><td>X.Y.Z</td>   <td>Pxyz</td>  <td>Pxyz</td></tr>
  -    <caption align=bottom>Example 3</caption>
  -</table>
  -
  -<para>In example 3, the categories <code>root</code>, <code>X</code> and
  -<code>X.Y.Z</code> are assigned the priorities <code>Proot</code>,
  -<code>Px</code> and <code>Pxyz</code> respectively. The category
  -<code>X.Y</code> inherits its priority value from its parent
  -<code>X</code>.
  -
  -<table border=1>
  -    <tr><th>Category<br>name</th><th>Assigned<br>priority</th>
  -    <th>Inherited<br>priority</th></tr>
  -    <tr align=left><td>root</td>    <td>Proot</td> <td>Proot</td></tr>
  -    <tr align=left><td>X </td>      <td>Px</td>    <td>Px</td></tr>
  -    <tr align=left><td>X.Y </td>    <td>none</td>  <td>Px</td></tr>
  -    <tr align=left><td>X.Y.Z</td>   <td>none</td>  <td>Px</td></tr>
  -    <caption align=bottom>Example 4</caption>
  -</table>
  -
  -<para>In example 4, the categories <code>root</code> and <code>X</code>
  -and are assigned the priorities <code>Proot</code> and <code>Px</code>
  -respectively. The categories <code>X.Y</code> and <code>X.Y.Z</code>
  -inherits their priority value from their nearest parent <code>X</code>
  -having an assigned priority..
  -
  -
  -<para>Logging requests are made by invoking one of the printing methods
  -of a category instance. These printing methods are 
  -
  -<code>
  -<a href="api/org/apache/log4j/Category.html#debug(java.lang.Object)">debug</a>,
  -
  -<a href="api/org/apache/log4j/Category.html#info(java.lang.Object)">info</a>, 
  -
  -<a href="api/org/apache/log4j/Category.html#warn(java.lang.Object)">warn</a>, 
  -<a href="api/org/apache/log4j/Category.html#error(java.lang.Object)">error</a>,
  -<a href="api/org/apache/log4j/Category.html#fatal(java.lang.Object)">fatal</a>
  - and <a href="api/org/apache/log4j/Category.html#log(org.apache.log4j.Priority, 
java.lang.Object)">log</a></code>. 
  -
  -
  -<para>By definition, the printing method determines the priority of a
  -logging request. For example, if <code>c</code> is a category
  -instance, then the statement <code>c.info("..")</code> is a logging
  -request of priority INFO.
  -
  -<para>A logging request is said to be <emphasis>enabled</emphasis> if its priority 
is
  -higher than or equal to the priority of its category. Otherwise, the
  -request is said to be <emphasis>disabled</emphasis>. A category without an
  -assigned priority will inherit one from the hierarchy. This rule is
  -summarized below.
  -
  -
  -<para>
  -<a name="selectionRule"><table bgcolor="#EEEE99">
  -  <tr>
  -  <td>
  -      <dl>
  -     <dt><b>Basic Selection Rule</b>
  -
  -     <dd><para>A log request of priority <i>p</i> in a category with
  -     inherited priority <i>q</i>, is enabled if <i> p &gt;=
  -     q</i>.  
  -      </dl>
  -</table>
  -
  -<para>This rule is at the heart of log4j. It assumes that priorities are
  -ordered. For the standard priorities, we have <code>DEBUG &lt; INFO
  -&lt; WARN &lt; ERROR &lt; FATAL</code>.
  -
  -<para>Here is an example of this rule. 
  -
  -<para><table bgcolor="CCCCCC">
  -<tr><td>
  -<pre>
  +       // Creation & retrieval methods:
  +       public static Category getRoot();
  +       public static Category getInstance(String name);
  +       
  +       // printing methods:
  +       public void debug(Object message);
  +       public void info(Object message);
  +       public void warn(Object message);
  +       public void error(Object message);
  +       
  +       // generic printing method:
  +       public void log(Priority p, Object message);
  +     }
  +
  +     </programlisting>
  +      </para>
  +
  +      <para>Loggers <emphasis>may</emphasis> be assigned levels. The
  +     set of possible levels, that is
  +     
  +     <ulink url="../api/org/apache/log4j/Level.html#DEBUG">DEBUG</ulink>, 
  +     <ulink url="../api/org/apache/log4j/Level.html#INFO">INFO</ulink>, 
  +     <ulink url="../api/org/apache/log4j/Level.html#WARN">WARN</ulink>, 
  +     <ulink url="../api/org/apache/log4j/Level.html#ERROR">ERROR</ulink> and 
  +     <ulink url="../api/org/apache/log4j/Level.html#FATAL">FATAL</ulink> 
  +     
  +     are defined in the <ulink
  +       url="../api/org/apache/log4j/Level.html">org.apache.log4j.Level</ulink>
  +     class. Although we do not encourage it, you may define your
  +     own levels by sub-classing the <classname>Level</classname>
  +     class. Possibly a better approach is will be explained later
  +     on.
  +      </para>
  +      
  +      <para>The <emphasis>effective level</emphasis> of logger is
  +     given by its assigned level. In case the logger has not been
  +     assigned a level, then it inherits the level of its closest
  +     ancestor with an assigned priority. More formally:
  +      </para>
  +      
  +
  +      <para id="inheritanceRule">
  +     <variablelist>
  +       <varlistentry>
  +         <term><emphasis role="strong">Effective level of a Logger</emphasis></term>
  +         
  +         <listitem>
  +           <para>The <emphasis>effective level</emphasis> of a given
  +             logger <emphasis>L</emphasis>, is equal to the first
  +             non-null level in the logger hierarchy, starting at
  +             <emphasis>L</emphasis> and proceeding upwards in the
  +             hierarchy towards the root category.
  +           </para>
  +         </listitem>
  +       </varlistentry>
  +     </variablelist>
  +      </para>
  +
  +      <para>To ensure that all loggers can eventually inherit a level,
  +     the root logger always has an assigned priority.</para>
  +     
  +      <para>Below are four tables with various assigned levels and the
  +     resulting effective levels according to the above rule.</para>
  +
  +      <para>
  +     <table>
  +       <title>Example 1</title>
  +       <tgroup cols="3" align="left">
  +         <thead>
  +           <row>
  +             <entry>Logger name</entry>
  +             <entry>Assigned level</entry>
  +             <entry>Effective level</entry>
  +           </row>
  +         </thead>
  +
  +         <tbody>           
  +           <row>
  +             <entry>root</entry>
  +             <entry>DEBUG</entry>
  +             <entry>DEBUG</entry></row>
  +           
  +           <row>
  +             <entry>X </entry>
  +             <entry>none</entry> 
  +             <entry>DEBUG</entry>
  +           </row>
  +           
  +           <row>
  +             <entry>X.Y </entry>
  +             <entry>none</entry>
  +             <entry>DEBUG</entry>
  +           </row>
  +           <row>
  +             <entry>X.Y.Z</entry> 
  +             <entry>none</entry>
  +             <entry>DEBUG</entry>
  +           </row>    
  +         </tbody>
  +       </tgroup>
  +     </table>
  +      </para>
  +     
  +      <para>In example 1 above, only the root logger is assigned a
  +     level.  This level, <varname>DEBUG</varname>, is inherited by
  +     the other loggers <varname>X</varname>, <varname>X.Y</varname>
  +     and <varname>X.Y.Z</varname>.
  +      </para>
  +
  +
  +      <para>
  +     <table>
  +       <title>Example 2</title>
  +       <tgroup cols="3" align="left">
  +         <thead>
  +           <row>
  +             <entry>Logger name</entry>
  +             <entry>Assigned level</entry>
  +             <entry>Effective level</entry>
  +           </row>
  +         </thead>
  +         <tbody>     
  +           
  +           <row>
  +             <entry>root</entry>  
  +             <entry>DEBUG</entry> 
  +             <entry>DEBUG</entry>
  +           </row>
  +           <row>
  +             <entry>X </entry>    
  +             <entry>ERROR</entry> 
  +             <entry>ERROR</entry>
  +           </row>
  +           <row>
  +             <entry>X.Y </entry>
  +             <entry>INFO</entry> 
  +             <entry>INFO</entry>
  +           </row>
  +           <row>
  +             <entry>X.Y.Z</entry>   
  +             <entry>DEBUG</entry>  
  +             <entry>DEBUG</entry>
  +           </row>
  +         </tbody>
  +       </tgroup>
  +     </table>
  +      </para>
  +
  +      <para>In example 2, all loggers have an assigned level. There is
  +     no need for level inheritence.</para>
  +
  +      <para>
  +     <table>
  +       <title>Example 3</title>
  +       <tgroup cols="3"  align="left">
  +         <thead>
  +           <row>
  +             <entry>Logger name</entry>
  +             <entry>Assigned level</entry>
  +             <entry>Effective level</entry>
  +           </row>
  +         </thead>
  +         
  +         <tbody>     
  +           <row>
  +             <entry>root</entry>
  +             <entry>INFO</entry> 
  +             <entry>INFO</entry></row>
  +           <row>
  +             <entry>X </entry>  
  +             <entry>DEBUG</entry>
  +             <entry>DEBUG</entry></row>
  +           <row>
  +             <entry>X.Y </entry> 
  +             <entry>none</entry>  
  +             <entry>DEBUG</entry></row>
  +           <row>
  +             <entry>X.Y.Z</entry>
  +             <entry>WARN</entry> 
  +             <entry>WARN</entry>
  +           </row>
  +         </tbody>
  +       </tgroup>
  +     </table>
  +      </para>
  +      
  +      <para>In example 3, the loggers <varname>root</varname>,
  +     <varname>X</varname> and <varname>X.Y.Z</varname> are
  +     assigned the priorities <varname>INFO</varname>,
  +     <varname>DEBUG</varname> and <varname>WARN</varname>
  +     respectively. The logger <varname>X.Y</varname> inherits
  +     its level value <varname>DEBUG</varname> from its parent
  +     <varname>X</varname>.
  +      </para>
  +
  +      <table>
  +     <title>Example 4</title>
  +     <tgroup cols="3">
  +       <thead>
  +         <row>
  +           <entry>Logger name</entry>
  +           <entry>Assigned level</entry>
  +           <entry>Effective level</entry>
  +         </row>
  +       </thead>
  +       
  +       <tbody>       
  +         
  +         <row><entry>root</entry>    
  +           <entry>DEBUG</entry> <entry>DEBUG</entry>
  +         </row>
  +         <row>
  +           <entry>X </entry>
  +           <entry>ERROR</entry> 
  +           <entry>DEBUG</entry>
  +         </row>
  +         <row>
  +           <entry>X.Y </entry>
  +           <entry>none</entry> 
  +           <entry>DEBUG</entry>
  +         </row>
  +         <row>
  +           <entry>X.Y.Z</entry>
  +           <entry>none</entry>
  +           <entry>DEBUG</entry></row>
  +       </tbody>
  +     </tgroup>
  +      </table>
  +
  +      <para>In example 4, the categories <varname>root</varname> and
  +     <varname>X</varname> and are assigned the priorities
  +     <varname>Proot</varname> and <varname>DEBUG</varname>
  +     respectively. The categories <varname>X.Y</varname> and
  +     <varname>X.Y.Z</varname> inherits their priority value from their
  +     nearest parent <varname>X</varname> having an assigned priority..
  +      </para>
   
  -   // get a category instance named "com.foo"
  -   Category  cat = Category.getInstance(<strong>"com.foo"</strong>);
  +      <para>Logging requests are made by invoking one of the
  +     printing methods of a logger instance. These printing
  +     methods are
  +
  +     <ulink 
url="../api/org/apache/log4j/Category.html#debug(java.lang.Object)">debug</ulink>,
  +       
  +     <ulink 
url="../api/org/apache/log4j/Category.html#info(java.lang.Object)">info</ulink>, 
  +       
  +     <ulink
  +       
url="../api/org/apache/log4j/Category.html#warn(java.lang.Object)">warn</ulink>,
  +     <ulink
  +       
url="../api/org/apache/log4j/Category.html#error(java.lang.Object)">error</ulink>,
  +     <ulink
  +       
url="../api/org/apache/log4j/Category.html#fatal(java.lang.Object)">fatal</ulink>
  +     and <ulink
  +       url="../api/org/apache/log4j/Category.html#log(org.apache.log4j.Priority,
  +       java.lang.Object)">log</ulink>.
  +      </para>
  +
  +
  +      <para>By definition, the printing method determines the level of
  +     a logging request. For example, if <varname>l</varname> is a
  +     logger instance, then the statement
  +     <function>l.info("..")</function> is a logging request of
  +     priority INFO.
  +      </para>
  +
  +      <para>A logging request is said to be
  +     <emphasis>enabled</emphasis> if its level is higher than or
  +     equal to the level of its logger. Otherwise, the request is
  +     said to be <emphasis>disabled</emphasis>. A logger without an
  +     assigned level will inherit one from the hierarchy. This rule
  +     is summarized below.
  +      </para>
  +
  +
  +      <para id="basicSelectionRule">
  +     <variablelist>
  +       <varlistentry>
  +         <term><emphasis role="strong">Basic Selection Rule</emphasis></term>
  +         
  +         <listitem>
  +           <para>A log request of priority
  +             <emphasis>p</emphasis> in a category with
  +             inherited priority <emphasis>q</emphasis>, is
  +             enabled if <emphasis> p &gt;= q</emphasis>.
  +           </para>
  +         </listitem>
  +       </varlistentry>
  +     </variablelist>
  +      </para>
  +
  +      <para >This rule is at the heart of log4j. It is based on the
  +     ordering of levels.  For the standard levels, we the
  +     following order <varname>DEBUG &lt; INFO &lt; WARN &lt;
  +       ERROR &lt; FATAL</varname>.
  +      </para>
  +      
  +      <para>Here is this rule in action.</para>
  +      
  +      <para>
  +     <programlisting>
  +   // get a logger instance named "com.foo"
  +   Logger  cat = Logger.getLogger("com.foo");
   
      // Now set its priority. Normally you do not need to set the 
  -   // priority of a category progamitcally. This is usually done 
  +   // priority of a logger progamitcally. This is usually done 
      // in configuration files.
  -   <strong>cat</strong>.setPriority(<font
  -   color="0000AA"><strong>Priority.INFO</strong></font>);
  +   cat.setLevel(Level.INFO);
   
  -   Category barcat = Category.getInstance(<strong>"com.foo.Bar"</strong>);
  +   Logger barcat = Logger.getLogger("com.foo.Bar");
    
  -   // This request is enabled, because <font 
color="00AA00"><strong>WARN</strong></font> &gt;= <font 
color="0000AA"><strong>INFO</strong></font>.
  -   cat.<font color="00AA00"><strong>warn</strong></font>("Low fuel level.");
  +   // This request is enabled, because WARN &gt;= INFO.
  +   cat.warn("Low fuel level.");
     
  -   // This request is disabled, because <font 
color="00AA00"><strong>DEBUG</strong></font> &lt; <font 
color="0000AA"><strong>INFO</strong></font>.
  -   cat.<font color="00AA00"><strong>debug</strong></font>("Starting search for 
nearest gas station."); 
  +   // This request is disabled, because DEBUG &lt; INFO.
  +  cat.debug("Starting search for nearest gas station."); 
    
  -   // The category instance barcat, named "com.foo.Bar",
  -   // will inherit its priority from the category named 
  +   // The logger instance barcat, named "com.foo.Bar",
  +   // will inherit its priority from the logger named 
      // "com.foo" Thus, the following request is enabled 
  -   // because <font color="00AA00"><strong>INFO</strong></font> &gt;= <font 
color="0000AA"><strong>INFO</strong></font>.  
  -   barcat.<font color="00AA00"><strong>info</strong></font>("Located nearest gas 
station."); 
  +   // because INFO &gt;= INFO.  
  +   barcat.info("Located nearest gas station."); 
   
  -   // This request is disabled, because <font 
color="00AA00"><strong>DEBUG</strong></font> &lt; <font 
color="0000AA"><strong>INFO</strong></font>.
  -   barcat.<font color="00AA00"><strong>debug</strong></font>("Exiting gas station 
search"); 
  -</pre>
  -</table>  
  -
  -<para>Calling the <code>getInstance</code> method with the same name will
  -always return a reference to the exact same category object. 
  -
  -<para>For example, in 
  -
  -<table bgcolor="CCCCCC">
  -<tr><td>
  -<pre>
  -   Categoty x = Category.getInstance("wombat");
  -   Categoty y = Category.getInstance("wombat");</pre>
  -</td>
  -</table>
  -<code>x</code> and <code>y</code> refer to <emphasis>exactly</emphasis> the same
  -category object.
  -
  -<para>Thus, it is possible to configure a category and then to retrieve
  -the same instance somewhere else in the code without passing around
  -references. In fundamental contradiction to biological parenthood,
  -where parents always preceed their children, log4j categories can be
  -created and configured in any order. In particular, a "parent"
  -category will find and link to its descendants even if it is
  -instantiated after them.
  -
  -<para>Configuration of the log4j environment is typically done at
  -application initialization. The preferred way is by reading a
  -configuration file. This approach will be discussed shortly.
  -
  -<para>Log4j makes it easy to name categories by <emphasis>software
  -component</emphasis>.  This can be accomplished by statically instantiating
  -a category in each class, with the category name equal to the fully
  -qualified name of the class. This is a useful and straightforward
  -method of defining categories. As the log output bears the name of the
  -generating category, this naming strategy makes it easy to identify
  -the origin of a log message.  However, this is only one possible,
  -albeit common, strategy for naming categories. Log4j does not restrict
  -the possible set of categories. The developer is free to name the
  -categories as desired.
  -
  -<para>Nevertheless, naming categories after the class where they are
  -located seems to be the best strategy known so far.
  -
  -<h2>Appenders and Layouts</h2>
  -
  -<para>The ability to selectively enable or disable logging requests based
  -on their category is only part of the picture. Log4j allows logging
  -requests to print to multiple destinations. In log4j speak, an output
  -destination is called an <emphasis>appender</emphasis>. Currently, appenders exist
  -for the <a href="api/org/apache/log4j/ConsoleAppender.html">console</a>, <a
  -href="api/org/apache/log4j/FileAppender.html">files</a>, GUI
  -components, <a
  -href="api/org/apache/log4j/net/SocketAppender.html">remote socket</a>
  -servers,  <a
  -href="api/org/apache/log4j/net/JMSAppender.html">JMS</a>,
  -
  -<a href="api/org/apache/log4j/nt/NTEventLogAppender.html"> NT
  -Event Loggers</a>, and remote UNIX <a
  -href="api/org/apache/log4j/net/SyslogAppender.html">Syslog</a>
  -daemons. It is also possible to log <a 
href="api/org/apache/log4j/AsyncAppender.html">asynchronously</a>.
  - 
  -<para>More than one appender can be attached to a category.
  +   // This request is disabled, because DEBUG &lt; INFO.
  +   barcat.debug("Exiting gas station search"); 
  +     </programlisting>
  +      </para>
  +
  +      <para>Calling the <varname>getLogger</varname> method
  +     with the same name will always return a reference to
  +     the exact same logger object.
  +      </para>
   
  -<para>The <a
  
-href="api/org/apache/log4j/Category.html#addAppender(org.apache.log4j.Appender)">addAppender</a>
  -method adds an appender to a given category.
  -
  -<b>Each enabled logging
  -request for a given category will be forwarded to all the appenders in
  -that category as well as the appenders higher in the hierarchy.</b> In
  -other words, appenders are inherited additively from the category
  -hierarchy. For example, if a console appender is added to the root
  -category, then all enabled logging requests will at least print on the
  -console. If in addition a file appender is added to a category, say
  -<emphasis>C</emphasis>, then enabled logging requests for <emphasis>C</emphasis> and
  -<emphasis>C</emphasis>'s children will print on a file <emphasis>and</emphasis> on 
the
  -console. It is possible to override this default behavior so that
  -appender accumulation is no longer additive by <a
  -href="api/org/apache/log4j/Category.html#setAdditivity(boolean)">setting
  -the additivity flag</a> to <code>false</code>.
  -
  -<para>The rules governing appender additivity are summarized below.
  -
  -<para>
  -<a name="additivity"><table bgcolor="#EEEE99">
  -  <tr>
  -  <td>
  -      <dl>
  -     <dt><b>Appender Additivity</b>
  -
  -     <dd><para>The output of a log statement of category <i>C</i> will
  -     go to all the appenders in <i>C</i> and its ancestors. This is
  -     the meaning of the term "appender additivity".
  -
  -     <para>However, if an ancestor of category <i>C</i>, say <i>P</i>,
  -     has the additivity flag set to <code>false</code>, then
  -     <i>C</i>'s output will be directed to all the appenders in
  -     <i>C</i> and it's ancestors upto and including <i>P</i> but
  -     not the appenders in any of the ancestors of <i>P</i>.
  -
  -     <para>Categories have their additivity flag set to
  -     <code>true</code> by default.
  -      </dl>
  -</table>
  -
  -
  -<para>The table below shows an example:
  -
  -<para><table align=center border=3 cellpadding=10>
  -  <tr rowspan="2">
  -  <th>Category<br>Name <th>Added<br>Appenders <th>Additivity<br>Flag <th>Output 
Targets <th>Comment
  -
  -<tr><td>root    <td>A1         <td>not applicable <td>A1
  -
  -    <td>The root category is anonymous but can be accessed with the
  -        Category.getRoot() method. There is no default appender
  -        attached to root.
  -
  -<tr><td>x       <td>A-x1, A-x2 <td>true <td>A1, A-x1, A-x2
  -    <td>Appenders of "x" and root.
  -
  -<tr><td>x.y     <td>none       <td>true <td>A1, A-x1, A-x2
  -    <td>Appenders of "x" and root.
  -
  -<tr><td>x.y.z   <td>A-xyz1     <td>true <td>A1, A-x1, A-x2, A-xyz1   
  -    <td>Appenders in "x.y.z", "x" and root.
  -
  -<tr><td>security        <td>A-sec       <td><font color="blue">false</font> 
  -                                           <td>A-sec
  -
  -    <td>No appender accumulation since the additivity flag is set to
  -        <code>false</code>. 
  -
  -<tr><td>security.access <td>none <td> true <td> A-sec <td>Only
  -    appenders of "security" because the additivity flag in "security" is
  -    set to <code>false</code>.
  -
  -</table>
  -
  -
  -<para>More often than not, users wish to customize not only the output
  -destination but also the output format. This is accomplished by
  -associating a <emphasis>layout</emphasis> with an appender. The layout is
  -responsible for formatting the logging request according to the user's
  -wishes, whereas an appender takes care of sending the formatted output
  -to its destination. 
  -
  -The <a
  -href="api/org/apache/log4j/PatternLayout.html">PatternLayout</a>, part
  -of the standard log4j distribution, lets the user specify the output
  -format according to conversion patterns similar to the C language
  -<code>printf</code> function.
  +      <para>For example, in 
  +     
  +     <programlisting>
  +      Logger x = Logger.getLogger("wombat");
  +      Logger y = Logger.getLogger("wombat");
  +     </programlisting>
  +
  +     <varname>x</varname> and <varname>y</varname> refer to
  +     <emphasis>exactly</emphasis> the same logger object.
  +      </para>
  +
  +      <para>Thus, it is possible to configure a logger and then to
  +     retrieve the same instance somewhere else in the code without
  +     passing around references. In contrast to biological
  +     parenthood, where parents always preceed their children, log4j
  +     loggers can be created and configured in any order. In
  +     particular, a "parent" logger will find and link to its
  +     descendants even if it is instantiated after them.
  +      </para>
  +
  +      <para>Configuration of the log4j environment is typically done
  +     at application initialization. The preferred way is by reading
  +     a configuration file. This approach will be discussed in <xref
  +     linkend="chap-configuration"/>.
  +      </para>
   
  -<para>For example, the PatternLayout with the conversion pattern "%r [%t]
  -%-5p %c - %m%n" will output something akin to:
  +      <para>Log4j makes it easy to name loggers by <emphasis>software
  +     component</emphasis>.  This can be accomplished by statically
  +     instantiating a logger in each class, with the logger name
  +     equal to the fully qualified name of the class. This is a
  +     useful and straightforward method of defining loggers. As the
  +     log output bears the name of the generating logger, this
  +     naming strategy makes it easy to identify the origin of a log
  +     message.  However, this is only one possible, albeit common,
  +     strategy for naming loggers. Log4j does not impose any
  +     restriction on the name of loggers. The user is free to name
  +     logger as she wishes.
  +      </para>
   
  -<pre>
  +      <para>Nevertheless, naming loggers after the class where they
  +     are located seems to be the best strategy known so far.</para>
  +
  +    </sect1>
  +
  +    <sect1>
  +      <title>Appenders and Layouts</title>
  +
  +      <para>The ability to selectively enable or disable logging
  +     requests based on their logger is only part of the
  +     picture. Log4j allows logging requests to print to multiple
  +     destinations. In log4j speak, an output destination is called
  +     an <emphasis>appender</emphasis>. Currently, appenders exist
  +     for the <ulink
  +     url="../api/org/apache/log4j/ConsoleAppender.html">console</ulink>,
  +     <ulink
  +     url="../api/org/apache/log4j/FileAppender.html">files</ulink>,
  +     GUI components, <ulink
  +     url="../api/org/apache/log4j/net/SocketAppender.html">remote
  +     socket</ulink> servers, <ulink
  +     url="../api/org/apache/log4j/net/JMSAppender.html">JMS</ulink>,
  +
  +     <ulink
  +       url="../api/org/apache/log4j/nt/NTEventLogAppender.html"> NT
  +       Event Loggers</ulink>, and remote UNIX <ulink
  +       url="../api/org/apache/log4j/net/SyslogAppender.html">Syslog</ulink>
  +       daemons. It is also possible to log <ulink
  +       url="../api/org/apache/log4j/AsyncAppender.html">asynchronously</ulink>.
  +      </para>
  +
  +      <para>More than one appender can be attached to a logger.</para>
  +
  +      <para>The <ulink
  +       
url="../api/org/apache/log4j/Logger.html#addAppender(org.apache.log4j.Appender)">addAppender</ulink>
  +     method adds an appender to a given logger.
  +
  +     <emphasis>Each enabled logging request for a given logger will
  +       be forwarded to all the appenders in that logger as well as
  +       the appenders higher in the hierarchy.</emphasis> In other
  +       words, appenders are inherited additively from the logger
  +       hierarchy. For example, if a console appender is added to
  +       the root logger, then all enabled logging requests will at
  +       least print on the console. If in addition a file appender
  +       is added to a logger, say <emphasis>C</emphasis>, then
  +       enabled logging requests for <emphasis>C</emphasis> and
  +       <emphasis>C</emphasis>'s children will print on a file
  +       <emphasis>and</emphasis> on the console. It is possible to
  +       override this default behavior so that appender accumulation
  +       is no longer additive by <ulink
  +       url="../api/org/apache/log4j/Logger.html#setAdditivity(boolean)">setting
  +       the additivity flag</ulink> to <varname>false</varname>.
  +      </para>
  +
  +      <para>The rules governing appender additivity are summarized below.</para>
  +
  +
  +      <para id="additivityRule">
  +     <variablelist>
  +       <varlistentry>
  +         <term><emphasis role="strong">Appender Additivity</emphasis></term>
  +         
  +         <listitem>
  +           <para>The output of a log statement of logger
  +             <emphasis>C</emphasis> will go to all the appenders in
  +             <emphasis>C</emphasis> and its ancestors. This is the
  +             meaning of the term "appender additivity".</para>
  +                     
  +           <para>However, if an ancestor of logger
  +             <emphasis>C</emphasis>, say <emphasis>P</emphasis>,
  +             has the additivity flag set to
  +             <varname>false</varname>, then <emphasis>C</emphasis>'s
  +             output will be directed to all the appenders in
  +             <emphasis>C</emphasis> and it's ancestors upto and
  +             including <emphasis>P</emphasis> but not the appenders
  +             in any of the ancestors of
  +             <emphasis>P</emphasis>.</para>
  +
  +           <para>Categories have their additivity flag set to
  +             <varname>true</varname> by default.</para>
  +         </listitem>
  +       </varlistentry>
  +     </variablelist>
  +      </para>
  +
  +      <para>The table below shows an example:</para>
  +
  +      <table>
  +     <title></title>
  +     <tgroup cols="5">
  +       <thead>
  +         <row>
  +           <entry>Logger Name</entry>
  +           <entry>Added Appenders</entry>        
  +           <entry>Additivity Flag</entry>
  +           <entry>Output Targets </entry>
  +           <entry>Comment</entry>
  +         </row>
  +       </thead>
  +       
  +     <tbody>
  +         <row>
  +           <entry>root</entry>
  +         <entry>A1</entry>
  +           <entry>not applicable</entry>
  +         <entry>A1</entry>
  +           <entry>The root logger is anonymous but can be accessed with the
  +             Logger.getRoot() method. There is no default appender
  +             attached to root.
  +           </entry>
  +       </row>
  +         
  +         <row>
  +           <entry>x</entry>
  +           <entry>A-x1, A-x2</entry>
  +           <entry>true</entry>
  +           <entry>A1, A-x1, A-x2</entry>         
  +           <entry>Appenders of "x" and root.</entry>
  +         </row>
  +         
  +         <row>
  +           <entry>x.y</entry> 
  +         <entry>none</entry>
  +           <entry>true</entry>
  +           <entry>A1, A-x1, A-x2</entry>
  +           <entry>Appenders of "x" and root.</entry>
  +         </row>
  +         
  +         <row>
  +           <entry>x.y.z</entry>
  +           <entry>A-xyz1</entry>
  +           <entry>true</entry>
  +           <entry>A1, A-x1, A-x2, A-xyz1</entry>
  +           <entry>Appenders in "x.y.z", "x" and root.</entry>
  +         </row>
  +         <row>
  +           <entry>security</entry>
  +           <entry>A-sec</entry>
  +           <entry>false</entry>
  +           <entry>A-sec</entry>
  +           
  +           <entry>No appender accumulation since the additivity flag is set to
  +             <varname>false</varname>. 
  +           </entry>
  +         </row>
  +       
  +         <row>
  +           <entry>security.access</entry>
  +           <entry>none</entry>
  +           <entry> true</entry>
  +           <entry> A-sec</entry>
  +           
  +           <entry>Only appenders of "security" because the additivity
  +             flag in "security" is set to <varname>false</varname>.</entry>
  +         </row>
  +       </tbody>
  +     </tgroup>
  +      </table>
  +
  +
  +      <para>More often than not, users wish to customize not only the
  +     output destination but also the output format. This is
  +     accomplished by associating a <emphasis>layout</emphasis> with
  +     an appender. The layout is responsible for formatting the
  +     logging request according to the user's wishes, whereas an
  +     appender takes care of sending the formatted output to its
  +     destination. </para>
  +
  +      <para>The <ulink
  +       url="../api/org/apache/log4j/PatternLayout.html">PatternLayout</ulink>,
  +       part of the standard log4j distribution, lets the user
  +       specify the output format according to conversion patterns
  +       similar to the C language <varname>printf</varname>
  +       function.
  +      </para>
  +
  +      <para>For example, the PatternLayout with the conversion pattern "%r [%t]
  +     %-5p %c - %m%n" will output something akin to:</para>
  +
  +     <programlisting>
   176 [main] INFO  org.foo.Bar - Located nearest gas station.
  -</pre>
  +     </programlisting>
   
  -<para>The first field is the number of milliseconds elapsed since the
  -start of the program.  The second field is the thread making the log
  -request.  The third field is the priority of the log statement. The
  -fourth field is the name of the category associated with the log
  -request. The text after the '-' is the message of the statement.
  -
  -<para>Just as importantly, log4j will render the content of the log
  -message according to user specified criteria. For example, if you
  -frequently need to log <code>Oranges</code>, an object type used in
  -your current project, then you can register an
  -<code>OrangeRenderer</code> that will be invoked whenever an orange
  -needs to be logged. 
  -
  -<para>Object rendering follows the class hierarchy. For example, assuming
  -oranges are fruits, if you register an <code>FruitRenderer</code>, all
  -fruits including oranges will be rendered by the
  -<code>FruitRenderer</code>, unless of course you registered an orange
  -specific <code>OrangeRenderer</code>.
  -
  -<para>Object renderers have to implement the
  -<a href="api/org/apache/log4j/or/ObjectRenderer.html">ObjectRenderer</a>
  -interface.
  +      <para>The first field is the number of milliseconds elapsed
  +since the start of the program.  The second field is the thread making
  +the log request.  The third field is the priority of the log
  +statement. The fourth field is the name of the logger associated with
  +the log request. The text after the '-' is the message of the
  +statement.</para>
  +
  +      <para>Just as importantly, log4j will render the content of the log
  +     message according to user specified criteria. For example, if you
  +     frequently need to log <varname>Oranges</varname>, an object type used in
  +     your current project, then you can register an
  +     <varname>OrangeRenderer</varname> that will be invoked whenever an orange
  +     needs to be logged. 
  +      </para>
   
  +      <para>Object rendering follows the class hierarchy. For example,
  +     assuming oranges are fruits, if you register an
  +     <varname>FruitRenderer</varname>, all fruits including oranges
  +     will be rendered by the <varname>FruitRenderer</varname>,
  +     unless of course you registered an orange specific
  +     <varname>OrangeRenderer</varname>.
  +      </para>
  +
  +      <para>Object renderers have to implement the <ulink
  +       url="../api/org/apache/log4j/or/ObjectRenderer.html">ObjectRenderer</ulink>
  +       interface.
  +      </para>
  +    </sect1>
  +
       <sect1>
         <title>Performance</title>
         <para></para>
  -    </sect1>
  -
  +    </sect1>      
   </chapter>
   
   <!--
  
  
  
  1.5       +1 -1      jakarta-log4j/src/docbook/manual.xml
  
  Index: manual.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/docbook/manual.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- manual.xml        2001/09/08 17:57:38     1.4
  +++ manual.xml        2001/09/09 20:20:26     1.5
  @@ -1,7 +1,7 @@
   <?xml version='1.0'?>
   <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" [
   <!ENTITY intro SYSTEM "intro.xml">
  -<!ENTITY architecture SYSTEM "archiecture.xml">
  +<!ENTITY architecture SYSTEM "architecture.xml">
   <!ENTITY conf SYSTEM "configuration.xml">
   <!ENTITY glo SYSTEM "glossary.xml">
   ]>
  
  
  

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

Reply via email to