alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 * Copyright (C) The Apache Software Foundation. All rights reserved.
 *
 * This software is published under the terms of the Apache Software License
 * version 1.1, a copy of which has been included  with this distribution in
 * the LICENSE.txt file.
 */

// Contributors: Christopher Williams
//               Mathias Bogaert

package org.apache.log4j;

import org.apache.log4j.helpers.DateLayout;
import org.apache.log4j.spi.LoggingEvent;

/**
 TTCC layout format consists of time, thread, category and nested
 diagnostic context information, hence the name.

 

Each of the four fields can be individually enabled or disabled. The time format depends on the DateFormat used.

Here is an example TTCCLayout output with the {@link org.apache.log4j.helpers.RelativeTimeDateFormat}.

176 [main] INFO  org.apache.log4j.examples.Sort - Populating an array of 2 elements in reverse order.
225 [main] INFO  org.apache.log4j.examples.SortAlgo - Entered the sort method.
262 [main] DEBUG org.apache.log4j.examples.SortAlgo.OUTER i=1 - Outer loop.
276 [main] DEBUG org.apache.log4j.examples.SortAlgo.SWAP i=1 j=0 - Swapping intArray[0] = 1 and intArray[1] = 0
290 [main] DEBUG org.apache.log4j.examples.SortAlgo.OUTER i=0 - Outer loop.
304 [main] INFO  org.apache.log4j.examples.SortAlgo.DUMP - Dump of interger array:
317 [main] INFO  org.apache.log4j.examples.SortAlgo.DUMP - Element [0] = 0
331 [main] INFO  org.apache.log4j.examples.SortAlgo.DUMP - Element [1] = 1
343 [main] INFO  org.apache.log4j.examples.Sort - The next log statement should be an error message.
346 [main] ERROR org.apache.log4j.examples.SortAlgo.DUMP - Tried to dump an uninitialized array.
        at org.apache.log4j.examples.SortAlgo.dump(SortAlgo.java:58)
        at org.apache.log4j.examples.Sort.main(Sort.java:64)
467 [main] INFO  org.apache.log4j.examples.Sort - Exiting main method.

The first field is the number of milliseconds elapsed since the start of the program. The second field is the thread outputting the log statement. The third field is the level, the fourth field is the category to which the statement belongs.

The fifth field (just before the '-') is the nested diagnostic context. Note the nested diagnostic context may be empty as in the first two statements. The text after the '-' is the message of the statement.

WARNING Do not use the same TTCCLayout instance from within different appenders. The TTCCLayout is not thread safe when used in his way. However, it is perfectly safe to use a TTCCLayout instance from just one appender.

{@link PatternLayout} offers a much more flexible alternative. @author Ceki Gülcü @author Heinz Richter */ public class TTCCLayout extends DateLayout { // Internal representation of options private boolean threadPrinting = true; private boolean categoryPrefixing = true; private boolean contextPrinting = true; protected final StringBuffer buf = new StringBuffer(256); /** Instantiate a TTCCLayout object with {@link org.apache.log4j.helpers.RelativeTimeDateFormat} as the date formatter in the local time zone. @since 0.7.5 */ public TTCCLayout() { this.setDateFormat(RELATIVE_TIME_DATE_FORMAT, null); } /** Instantiate a TTCCLayout object using the local time zone. The DateFormat used will depend on the dateFormatType.

This constructor just calls the {@link DateLayout#setDateFormat} method. */ public TTCCLayout(String dateFormatType) { this.setDateFormat(dateFormatType); } /** The ThreadPrinting option specifies whether the name of the current thread is part of log output or not. This is true by default. */ public void setThreadPrinting(boolean threadPrinting) { this.threadPrinting = threadPrinting; } /** Returns value of the ThreadPrinting option. */ public boolean getThreadPrinting() { return threadPrinting; } /** The CategoryPrefixing option specifies whether {@link Category} name is part of log output or not. This is true by default. */ public void setCategoryPrefixing(boolean categoryPrefixing) { this.categoryPrefixing = categoryPrefixing; } /** Returns value of the CategoryPrefixing option. */ public boolean getCategoryPrefixing() { return categoryPrefixing; } /** The ContextPrinting option specifies log output will include the nested context information belonging to the current thread. This is true by default. */ public void setContextPrinting(boolean contextPrinting) { this.contextPrinting = contextPrinting; } /** Returns value of the ContextPrinting option. */ public boolean getContextPrinting() { return contextPrinting; } /** In addition to the level of the statement and message, the returned byte array includes time, thread, category and {@link NDC} information.

Time, thread, category and diagnostic context are printed depending on options. @param category @param level @param message */ public String format(LoggingEvent event) { // Reset buf buf.setLength(0); dateFormat(buf, event); if(this.threadPrinting) { buf.append('['); buf.append(event.getThreadName()); buf.append("] "); } buf.append(event.getLevel().toString()); buf.append(' '); if(this.categoryPrefixing) { buf.append(event.getLoggerName()); buf.append(' '); } if(this.contextPrinting) { String ndc = event.getNDC(); if(ndc != null) { buf.append(ndc); buf.append(' '); } } buf.append("- "); buf.append(event.getRenderedMessage()); buf.append(LINE_SEP); return buf.toString(); } /** The TTCCLayout does not handle the throwable contained within {@link LoggingEvent LoggingEvents}. Thus, it returns true. @since version 0.8.4 */ public boolean ignoresThrowable() { return true; } }

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.