org.apache.log4j.TTCCLayout Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// 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 event The event to format
*
*/
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;
}
}