ceki        01/09/20 15:19:07

  Modified:    src/docbook configuration.xml faq.xml glossary.xml
                        manual.xml
  Added:       src/docbook trouble.xml
  Log:
  Added/merged the trouble shooting guide to docbook manual.
  
  Revision  Changes    Path
  1.5       +4 -0      jakarta-log4j/src/docbook/configuration.xml
  
  Index: configuration.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/docbook/configuration.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- configuration.xml 2001/09/18 22:03:15     1.4
  +++ configuration.xml 2001/09/20 22:19:07     1.5
  @@ -2,6 +2,10 @@
     <title>Configuration</title>
   
   
  +  <para>
  +    disabling from configuration files, duplicates in log
  +  </para>
  +
     <para>Inserting log requests into the application code requires a
       fair amount of planning and effort. Observation shows that
       approximately 4 percent of code is dedicated to
  
  
  
  1.3       +1 -1      jakarta-log4j/src/docbook/faq.xml
  
  Index: faq.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/docbook/faq.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- faq.xml   2001/09/19 22:09:10     1.2
  +++ faq.xml   2001/09/20 22:19:07     1.3
  @@ -1,4 +1,4 @@
  -  <chapter>
  +  <chapter id="faq">
     <title>Frequently Asked Questions</title>
     
     <qandaset>
  
  
  
  1.4       +1 -1      jakarta-log4j/src/docbook/glossary.xml
  
  Index: glossary.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/docbook/glossary.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- glossary.xml      2001/09/19 22:09:10     1.3
  +++ glossary.xml      2001/09/20 22:19:07     1.4
  @@ -27,7 +27,7 @@
         <para>The logging API introduced in JDK 1.4. It is the result of
        the <ulink
        
url="http://jcp.org/aboutJava/communityprocess/review/jsr047/index.html";>JSR47</ulink>
  -     effort.  
  +     effort.
   
         </para>
       </glossdef>
  
  
  
  1.9       +2 -1      jakarta-log4j/src/docbook/manual.xml
  
  Index: manual.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/docbook/manual.xml,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- manual.xml        2001/09/10 22:20:29     1.8
  +++ manual.xml        2001/09/20 22:19:07     1.9
  @@ -5,6 +5,7 @@
   <!ENTITY conf SYSTEM "configuration.xml">
   <!ENTITY faq SYSTEM "faq.xml">
   <!ENTITY glo SYSTEM "glossary.xml">
  +<!ENTITY trouble SYSTEM "trouble.xml">
   ]>
   
   <book lang="en">
  @@ -38,8 +39,8 @@
     &architecture  
     &conf
     &faq
  +  &trouble
     &glo
  -  
   
   </book>
      
  
  
  
  1.1                  jakarta-log4j/src/docbook/trouble.xml
  
  Index: trouble.xml
  ===================================================================
   <chapter id="troubleShooting">
    <title>Trouble Shooting Guide</title>
    
      <para>
        This chapter contains a list of commonly encountered problems
        when using log4j.
      </para>
    <qandaset>
      
      <qandaentry>
        <question>
        <para>Log4j tells me to initialize properly.</para>
        </question>
        <answer>
          <para>
            Logging output is written to a target by using an appender. If no
            appenders are attached to a category nor to any of its ancestors, you
            will get the following message when trying to log:
          </para>
          
            <screen>
  log4j: No appenders could be found for category (some.category.name).
  log4j: Please initialize the log4j system properly.
            </screen>
            
          <para><emphasis>Log4j does not have a default logging
              target.</emphasis> It is the user's responsibility to
              ensure that all categories can inherit an appender.
              This can be easily achieved by attaching an appender to
              the root category.
          </para>
        </answer>
        </qandaentry>
  
        <qandaentry>
        <question>
          <para>Duplicates in log4j output.</para>
        </question>
  
        <answer>
          
          <para>The reason for observing duplicates in log4j output is
            either due to having added the same appender multiple
            times to the same logger (typically root) or having
            added the same appender to different categories ignoring
            the fact that appenders are inherited cumulatively.
          </para>
  
          <para>Log4j does not eliminate appender duplicates. In other
            words, if you add the same appender to a logger
            <emphasis>n</emphasis> times, that appender will be
            invoked <emphasis>n</emphasis> times to append to its
            target.
          </para>
  
          <para>A slightly different cause is adding different
            appenders all sharing the same underlying output target to
            some logger. In the most common occurrence of this
            phenomenon, the BasicConfigurator.configure() method is
            invoked multiple times. Each time it is invoked, this
            method adds an appender with a
            <function>System.out</function> target to the root
            logger.</para>
  
          <para>One other common mistake is to forget that appenders
            are inherited cumulatively from the hierarchy. For
            example, if you add an appender, say
            <function>A</function>, to the root logger, all other
            categories will inherit <function>A</function> as an
            appender. Thus, if you add <function>A</function> to a
            logger, say <function>L</function>, then an enabled
            statement of logger <function>L</function>, will print to
            <function>A</function> twice, once because
            <function>A</function> is in root and once because it is
            in <function>L</function>.
          </para>
  
        </answer>
        </qandaentry>
        
  
        <qandaentry>
        <question>
          <para>Caller location information is printed as a "?"
            character.</para>
        </question>
  
        <answer>
          <para>Location information is extracted automatically by the
            PatternLayout conversion patterns %C, %F, %M and
            %L. However, some just-in-time (JIT) compilers make it
            impossible to extract location information. It is also
            possible that the compiler that generated the byte code
            may have omitted the LineNumber table as is done by -O
            option of javac and jikes.
          </para>
  
          <para>You can remedy this problem by disabling the JIT compiler and by
            compiling the code without the -O option.
          </para>
  
          <para>Wrappers or subclasses of Logger constiture a special
          case.</para>
  
          <para>Wrappers or subclasses of <function>Logger</function>
            need supply their fully qualified class name to the
            <function>Logger.log</function> method or to
            <function>Logger.forcedLog</function> methods so that the
            caller location information can be extracted correctly.
          </para>
  
          <para>This approach will work correctly in all cases except
            if the class invoking the extended logger instance has the
            same prefix as the extended logger class. For example,
            calling an instance of
            <function>com.foo.BarLogger</function> from the
            <function>com.foo.BarLoggerTest</function> class will not
            yield the correct caller information. To circumvent this
            "bug", either perform the tests from a class with a
            different name or add a dot to the fully qualified name of
            the extending class that you supply to
            <function>Loggerlog</function> to
            <function>Logger.forcedLog</function> methods. For the
            <function>com.foo.BarLogger</function> example, supply the
            string <function>"com.foo.BarLogger."</function>.
          </para>
  
        </answer>
        </qandaentry>
  
        <qandaentry>
        <question>
          <function>ClassCastException</function> when instantiating
          <function>Logger</function> subclasses.
        </question>
  
        <answer>
          
          <para>This exception is thrown because log4j does not
            support homonyms. For example, the following will
            systematically throw a <function>ClassCastException</function>
            <programlisting>
              Logger c1 = Logger.getLogger("bad"); 
               MyLogger c2 = (MyLogger) MyLogger.getLogger("bad");
            </programlisting>
  
            where <function>MyLogger</function> is a subclass of
            <function>Logger</function>. The problem occurs because the
            second <function>getInstance</function> invocation will retrieve
            the Logger created in the fist invocation. This instance
            is a <function>Logger</function> object and cannot be cast to
            <function>MyLogger</function>.  </para>
  
  
  
          <para>By default, the <function>PropertyConfigurator</function> will
            create and configure <function>org.apache.log4j.Logger</function>
            objects. Thus, if you try to instantiate a Logger subclass
            for an already existing logger, and try to cast it to the
            subclass type, you will systematically get a
            <function>ClassCastException</function>.</para>
  
          <para>To address this problem, the
            <function>PropertyConfigurator</function> admits the
            <function>log4j.loggerFactory</function> key. The value of this
            key will be used as the factory to invoke when
            instantiating Logger objects.</para>
  
          <para>The <function>DOMConfigurator</function> has a finer grain
            method for setting the class of the logger object to
            instantiate.</para>
  
        </answer>
        </qandaentry>
  
  
        <qandaentry>
        <question>
        </question>
  
        <answer>
        </answer>
        </qandaentry>
        
  
      
      </qandaset>
    </chapter>
  
  
  
  

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

Reply via email to