/* * 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. */ #ifndef _LOG4CXX_TTCC_LAYOUT_H #define _LOG4CXX_TTCC_LAYOUT_H #if defined(_MSC_VER) #pragma warning ( push ) #pragma warning ( disable: 4231 4251 4275 4786 ) #endif #include namespace log4cxx { /** TTCC layout format consists of time, thread, logger name 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 helpers::RelativeTimeDateFormat RelativeTimeDateFormat}.

    176 [main] INFO  examples.Sort - Populating an array of 2 elements in reverse order.
    225 [main] INFO  examples.SortAlgo - Entered the sort method.
    262 [main] DEBUG examples.SortAlgo.OUTER i=1 - Outer loop.
    276 [main] DEBUG examples.SortAlgo.SWAP i=1 j=0 - Swapping intArray[0] = 1 and intArray[1] = 0
    290 [main] DEBUG examples.SortAlgo.OUTER i=0 - Outer loop.
    304 [main] INFO  examples.SortAlgo.DUMP - Dump of interger array:
    317 [main] INFO  examples.SortAlgo.DUMP - Element [0] = 0
    331 [main] INFO  examples.SortAlgo.DUMP - Element [1] = 1
    343 [main] INFO  examples.Sort - The next log statement should be an error message.
    346 [main] ERROR examples.SortAlgo.DUMP - Tried to dump an uninitialized array.
    467 [main] INFO  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 logger 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.

PatternLayout offers a much more flexible alternative. */ class LOG4CXX_EXPORT TTCCLayout : public helpers::DateLayout { private: // Internal representation of options bool threadPrinting; bool categoryPrefixing; bool contextPrinting; bool filePrinting; public: DECLARE_LOG4CXX_OBJECT(TTCCLayout) BEGIN_LOG4CXX_CAST_MAP() LOG4CXX_CAST_ENTRY(TTCCLayout) LOG4CXX_CAST_ENTRY_CHAIN(Layout) END_LOG4CXX_CAST_MAP() /** Instantiate a TTCCLayout object with {@link helpers::RelativeTimeDateFormat RelativeTimeDateFormat} as the date formatter in the local time zone. */ TTCCLayout(); /** Instantiate a TTCCLayout object using the local time zone. The DateFormat used will depend on the dateFormatType.

This constructor just calls the {@link helpers::DateLayout#setDateFormat DateLayout::setDateFormat} method. */ TTCCLayout(const LogString& dateFormatType); /** The ThreadPrinting option specifies whether the name of the current thread is part of log output or not. This is true by default. */ inline void setThreadPrinting(bool threadPrinting1) { this->threadPrinting = threadPrinting1; } /** Returns value of the ThreadPrinting option. */ inline bool getThreadPrinting() const { return threadPrinting; } /** The CategoryPrefixing option specifies whether Logger name is part of log output or not. This is true by default. */ inline void setCategoryPrefixing(bool categoryPrefixing1) { this->categoryPrefixing = categoryPrefixing1; } /** Returns value of the CategoryPrefixing option. */ inline bool getCategoryPrefixing() const { return categoryPrefixing; } /** The ContextPrinting option specifies log output will include the nested context information belonging to the current thread. This is true by default. */ inline void setContextPrinting(bool contextPrinting1) { this->contextPrinting = contextPrinting1; } /** Returns value of the ContextPrinting option. */ inline bool getContextPrinting() const { return contextPrinting; } /** The FilePrinting option specifies log output will include the file and the line where the log statement was written. */ inline void setFilePrinting(bool filePrinting1) { this->filePrinting = filePrinting1; } /** Returns value of the ContextPrinting option. */ inline bool getFilePrinting() const { return filePrinting; } /** In addition to the level of the statement and message, this function writes to the ouput stream time, thread, logger and NDC information.

Time, thread, logger and diagnostic context are printed depending on options. @param output destination to receive formatted output. @param event event to format. @param pool pool used to allocate memory needed during formatting. */ virtual void format(LogString& output, const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& pool) const; /** The TTCCLayout does not handle the throwable contained within {@link spi::LoggingEvent LoggingEvents}. Thus, it returns true. */ virtual bool ignoresThrowable() const { return true; } }; LOG4CXX_PTR_DEF(TTCCLayout); } #if defined(_MSC_VER) #pragma warning ( pop ) #endif #endif