View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17
    18  // Contributors: Christopher Williams
    19  //               Mathias Bogaert
    20
    21  package org.apache.log4j;
    22
    23  import org.apache.log4j.helpers.DateLayout;
    24  import org.apache.log4j.spi.LoggingEvent;
    25
    26  /***
    27   TTCC layout format consists of time, thread, category and nested
    28   diagnostic context information, hence the name.
    29
    30   <p>Each of the four fields can be individually enabled or
    31   disabled. The time format depends on the <code>DateFormat</code>
    32   used.
    33
    34   <p>Here is an example TTCCLayout output with the
    35   {@link org.apache.log4j.helpers.RelativeTimeDateFormat}.
    36
    37   <pre>
    38  176 [main] INFO  org.apache.log4j.examples.Sort - Populating an array of 2 elements in reverse order.
    39  225 [main] INFO  org.apache.log4j.examples.SortAlgo - Entered the sort method.
    40  262 [main] DEBUG org.apache.log4j.examples.SortAlgo.OUTER i=1 - Outer loop.
    41  276 [main] DEBUG org.apache.log4j.examples.SortAlgo.SWAP i=1 j=0 - Swapping intArray[0] = 1 and intArray[1] = 0
    42  290 [main] DEBUG org.apache.log4j.examples.SortAlgo.OUTER i=0 - Outer loop.
    43  304 [main] INFO  org.apache.log4j.examples.SortAlgo.DUMP - Dump of interger array:
    44  317 [main] INFO  org.apache.log4j.examples.SortAlgo.DUMP - Element [0] = 0
    45  331 [main] INFO  org.apache.log4j.examples.SortAlgo.DUMP - Element [1] = 1
    46  343 [main] INFO  org.apache.log4j.examples.Sort - The next log statement should be an error message.
    47  346 [main] ERROR org.apache.log4j.examples.SortAlgo.DUMP - Tried to dump an uninitialized array.
    48          at org.apache.log4j.examples.SortAlgo.dump(SortAlgo.java:58)
    49          at org.apache.log4j.examples.Sort.main(Sort.java:64)
    50  467 [main] INFO  org.apache.log4j.examples.Sort - Exiting main method.
    51  </pre>
    52
    53    <p>The first field is the number of milliseconds elapsed since the
    54    start of the program. The second field is the thread outputting the
    55    log statement. The third field is the level, the fourth field is
    56    the category to which the statement belongs.
    57
    58    <p>The fifth field (just before the '-') is the nested diagnostic
    59    context.  Note the nested diagnostic context may be empty as in the
    60    first two statements. The text after the '-' is the message of the
    61    statement.
    62
    63    <p><b>WARNING</b> Do not use the same TTCCLayout instance from
    64    within different appenders. The TTCCLayout is not thread safe when
    65    used in his way. However, it is perfectly safe to use a TTCCLayout
    66    instance from just one appender.
    67
    68    <p>{@link PatternLayout} offers a much more flexible alternative.
    69
    70    @author Ceki G&uuml;lc&uuml;
    71    @author <A HREF="mailto:heinz.richter@ecmwf.int">Heinz Richter</a>
    72
    73  */
    74  public class TTCCLayout extends DateLayout {
    75
    76    // Internal representation of options
    77    private boolean threadPrinting    = true;
    78    private boolean categoryPrefixing = true;
    79    private boolean contextPrinting   = true;
    80
    81
    82    protected final StringBuffer buf = new StringBuffer(256);
    83
    84
    85    /***
    86       Instantiate a TTCCLayout object with {@link
    87       org.apache.log4j.helpers.RelativeTimeDateFormat} as the date
    88       formatter in the local time zone.
    89
    90       @since 0.7.5 */
    91    public TTCCLayout() {
    92      this.setDateFormat(RELATIVE_TIME_DATE_FORMAT, null);
    93    }
    94
    95
    96    /***
    97       Instantiate a TTCCLayout object using the local time zone. The
    98       DateFormat used will depend on the <code>dateFormatType</code>.
    99
    100      <p>This constructor just calls the {@link
    101      DateLayout#setDateFormat} method.
    102
    103      */
    104   public TTCCLayout(String dateFormatType) {
    105     this.setDateFormat(dateFormatType);
    106   }
    107
    108
    109   /***
    110      The <b>ThreadPrinting</b> option specifies whether the name of the
    111      current thread is part of log output or not. This is true by default.
    112    */
    113   public
    114   void setThreadPrinting(boolean threadPrinting) {
    115     this.threadPrinting = threadPrinting;
    116   }
    117
    118   /***
    119      Returns value of the <b>ThreadPrinting</b> option.
    120    */
    121   public
    122   boolean getThreadPrinting() {
    123     return threadPrinting;
    124   }
    125
    126   /***
    127      The <b>CategoryPrefixing</b> option specifies whether {@link Category}
    128      name is part of log output or not. This is true by default.
    129    */
    130   public
    131   void setCategoryPrefixing(boolean categoryPrefixing) {
    132     this.categoryPrefixing = categoryPrefixing;
    133   }
    134
    135   /***
    136      Returns value of the <b>CategoryPrefixing</b> option.
    137    */
    138   public
    139   boolean getCategoryPrefixing() {
    140     return categoryPrefixing;
    141   }
    142
    143   /***
    144      The <b>ContextPrinting</b> option specifies log output will include
    145      the nested context information belonging to the current thread.
    146      This is true by default.
    147    */
    148   public
    149   void setContextPrinting(boolean contextPrinting) {
    150     this.contextPrinting = contextPrinting;
    151   }
    152
    153   /***
    154      Returns value of the <b>ContextPrinting</b> option.
    155    */
    156   public
    157   boolean getContextPrinting() {
    158     return contextPrinting;
    159   }
    160
    161   /***
    162    In addition to the level of the statement and message, the
    163    returned byte array includes time, thread, category and {@link NDC}
    164    information.
    165
    166    <p>Time, thread, category and diagnostic context are printed
    167    depending on options.
    168
    169     @param event The event to format
    170
    171   */
    172   public
    173   String format(LoggingEvent event) {
    174
    175     // Reset buf
    176     buf.setLength(0);
    177
    178     dateFormat(buf, event);
    179
    180     if(this.threadPrinting) {
    181       buf.append('[');
    182       buf.append(event.getThreadName());
    183       buf.append("] ");
    184     }
    185     buf.append(event.getLevel().toString());
    186     buf.append(' ');
    187
    188     if(this.categoryPrefixing) {
    189       buf.append(event.getLoggerName());
    190       buf.append(' ');
    191     }
    192
    193     if(this.contextPrinting) {
    194        String ndc = event.getNDC();
    195
    196       if(ndc != null) {
    197 	buf.append(ndc);
    198 	buf.append(' ');
    199       }
    200     }
    201     buf.append("- ");
    202     buf.append(event.getRenderedMessage());
    203     buf.append(LINE_SEP);
    204     return buf.toString();
    205   }
    206
    207  /***
    208      The TTCCLayout does not handle the throwable contained within
    209      {@link LoggingEvent LoggingEvents}. Thus, it returns
    210      <code>true</code>.
    211
    212      @since version 0.8.4 */
    213   public
    214   boolean ignoresThrowable() {
    215     return true;
    216   }
    217 }