--- /dev/null
+/*
+ * 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.
+
+ <p>Each of the four fields can be individually enabled or
+ disabled. The time format depends on the <code>DateFormat</code>
+ used.
+
+ <p>Here is an example TTCCLayout output with the
+ {@link org.apache.log4j.helpers.RelativeTimeDateFormat}.
+
+ <pre>
+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.
+</pre>
+
+ <p>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.
+
+ <p>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.
+
+ <p><b>WARNING</b> 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.
+
+ <p>{@link PatternLayout} offers a much more flexible alternative.
+
+ @author Ceki Gülcü
+ @author <A HREF="mailto:heinz.richter@ecmwf.int">Heinz Richter</a>
+
+*/
+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 <code>dateFormatType</code>.
+
+ <p>This constructor just calls the {@link
+ DateLayout#setDateFormat} method.
+
+ */
+ public TTCCLayout(String dateFormatType) {
+ this.setDateFormat(dateFormatType);
+ }
+
+
+ /**
+ The <b>ThreadPrinting</b> 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 <b>ThreadPrinting</b> option.
+ */
+ public
+ boolean getThreadPrinting() {
+ return threadPrinting;
+ }
+
+ /**
+ The <b>CategoryPrefixing</b> 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 <b>CategoryPrefixing</b> option.
+ */
+ public
+ boolean getCategoryPrefixing() {
+ return categoryPrefixing;
+ }
+
+ /**
+ The <b>ContextPrinting</b> 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 <b>ContextPrinting</b> 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.
+
+ <p>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
+ <code>true</code>.
+
+ @since version 0.8.4 */
+ public
+ boolean ignoresThrowable() {
+ return true;
+ }
+}