Peano
|
Command Line Logger. More...
#include <CommandLineLogger.h>
Public Member Functions | |
~CommandLineLogger () | |
bool | getLogMachineName () const |
Is public as some analysis frameworks check explicitly whether these features are switched on. | |
bool | getLogThreadName () const |
Is public as some analysis frameworks check explicitly whether these features are switched on. | |
bool | getLogTrace () const |
Is public as some analysis frameworks check explicitly whether these features are switched on. | |
bool | getLogTimeStamp () const |
Is public as some analysis frameworks check explicitly whether these features are switched on. | |
void | debug (long int timestampNanoseconds, int rank, int threadId, const std::string &trace, const std::string &message) |
void | info (long int timestampNanoseconds, int rank, int threadId, const std::string &trace, const std::string &message) |
void | warning (long int timestampNanoseconds, int rank, int threadId, const std::string &trace, const std::string &message) |
Write Warning. | |
void | error (long int timestampNanoseconds, int rank, int threadId, const std::string &trace, const std::string &message) |
Write Error. | |
void | traceIn (long int timestampNanoseconds, int rank, int threadId, const std::string &trace, const std::string &message) |
void | traceOut (long int timestampNanoseconds, int rank, int threadId, const std::string &trace, const std::string &message) |
void | indent (bool indent, const std::string &trace, const std::string &message) |
Tells the logger to increment/decrement the indent. | |
void | setLogColumnSeparator (const std::string &separator=" ") |
void | setLogTimeStamp (bool value=true) |
void | setLogTimeStampHumanReadable (bool value=true) |
void | setLogMachineName (bool value=true) |
void | setLogThreadName (bool value=true) |
void | setLogMessageType (bool value=true) |
void | setLogTrace (bool value=true) |
void | setLogFormat (const std::string &columnSeparator, bool logTimeStamp, bool logTimeStampHumanReadable, bool logMachineName, bool logThreadName, bool logMessageType, bool logTrace, const std::string &outputLogFileName) |
void | setOutputFile (const std::string &outputLogFileName) |
Is redundant, as you could use setLogFormat() instead. | |
void | setQuitOnError (bool value) |
void | closeOutputStreamAndReopenNewOne () |
The command line logger can pipe debug data into an output file instead of piping everything to the terminal. | |
void | close () |
Static Public Member Functions | |
static CommandLineLogger & | getInstance () |
Private Member Functions | |
CommandLineLogger & | operator= (const CommandLineLogger &) |
Declared private since assignment does not make sense for an output class (output information mismatch). | |
CommandLineLogger (const CommandLineLogger &) | |
Declared private since copying does not make sense for an output class (output information mismatch). | |
std::string | addSeparators (std::string::size_type spaces, std::string message) const |
Takes the message and adds spaces such that the entries are aligned like in a table. | |
std::string | constructMessageString (std::string messageType, long int timestampNanoseconds, int rank, int threadId, const std::string &trace, const std::string &message) |
Construct message string. | |
void | configureOutputStreams () |
Configures the output streams. | |
CommandLineLogger () | |
It's a singleton. | |
std::string | getLogColumnSeparator () const |
bool | getLogTimeStampHumanReadable () const |
bool | getLogMessageType () const |
std::ostream & | out () |
void | reopenOutputStream () |
Static Private Member Functions | |
static std::string | getTimeStampHumanReadable (long int timestampNanoseconds) |
Private Attributes | |
tarch::multicore::BooleanSemaphore | _semaphore |
std::string | _logColumnSeparator |
Test for the column separator of a string output. | |
bool | _logTimeStamp |
bool | _logTimeStampHumanReadable |
bool | _logMachineName |
bool | _logThreadName |
bool | _logMessageType |
bool | _logTrace |
std::ostream * | _outputStream |
bool | _hasWrittenToOuputStream |
int | _iterationCounter |
std::string | _outputFileName |
bool | _quitOnError |
std::stack< std::string > | _indentTraces |
Static Private Attributes | |
static Log | _log |
static CommandLineLogger | _singleton |
static std::string::size_type | _indent = 0 |
Indent is supported only in debug mode. | |
static const std::string::size_type | NumberOfIndentSpaces = 2 |
static const std::string::size_type | NumberOfStandardColumnSpaces = 12 |
static const std::string::size_type | NumberOfTraceColumnSpaces = 55 |
The trace column is not formatted using only tabulators, but it uses spaces to create a unique column size: First, TRACE_SPACE_NUMBER-n spaces are added if n is the length of the original string, then a \t is appended. | |
static const int | DigitsInFilenamesIterationNumer = 5 |
Command Line Logger.
Standard log output device. Implements the LogHandle. Usually there's only one instance of this class for only the Log type aggregates it in a static way. For a detailed description of this compiler flags please browse through the static consts of the class or the howto page.
An interesting issue is the behaviour of the command line logger in the parallel mode if debug is switched on. In this case the number of messages soon becomes unreadable for any human. Thus, the command line logger internally creates one output file rank.log for each rank and writes all the information into this file. info, warnings and errors are written (in short form) to std::cout / std::cerr, too.
If the debug mode is not set, all information is written to std::cout.
Note, that if multithreading is switched on (TBB-flag), the access to std::cout or the logfile respectively is synchronized. The other methods are not thread-safe and should be called only in safe context for defined behaviour.
Definition at line 48 of file CommandLineLogger.h.
|
private |
Declared private since copying does not make sense for an output class (output information mismatch).
Definition at line 79 of file CommandLineLogger.cpp.
|
private |
It's a singleton.
Definition at line 35 of file CommandLineLogger.cpp.
References configureOutputStreams(), setLogColumnSeparator(), setLogMachineName(), setLogMessageType(), setLogThreadName(), setLogTimeStamp(), setLogTimeStampHumanReadable(), and setLogTrace().
tarch::logging::CommandLineLogger::~CommandLineLogger | ( | ) |
Definition at line 82 of file CommandLineLogger.cpp.
|
private |
Takes the message and adds spaces such that the entries are aligned like in a table.
Should either be passed NumberOfIndentSpaces or NumberOfTraceSpaces.
Definition at line 87 of file CommandLineLogger.cpp.
void tarch::logging::CommandLineLogger::close | ( | ) |
Definition at line 467 of file CommandLineLogger.cpp.
void tarch::logging::CommandLineLogger::closeOutputStreamAndReopenNewOne | ( | ) |
The command line logger can pipe debug data into an output file instead of piping everything to the terminal.
This happens if you call setLogFormat() with a non-empty log file name. This operation closes the output file, and opens a new one. Many uses, e.g., prefer one debug output file per traversal.
If you PeanoDebug symbol is bigger than 0, the routine gives you some hint which trace objects are still on the stack, i.e. which traceIn has not yet been matched by a traceOut.
Definition at line 99 of file CommandLineLogger.cpp.
References logWarning.
Referenced by runParallel(), and runSerial().
|
private |
Configures the output streams.
Definition at line 66 of file CommandLineLogger.cpp.
Referenced by CommandLineLogger().
|
private |
Construct message string.
!!! Thread Safety
The message string relies on the global field _indent. This one might change throughout the execution of this method. However, I accept such a behavior: Changing _indent throughout the message execution makes the method add the wrong number of whitespaces in front of the message. That is a 'bug' we can accept.
To satisfy Intel Inspector et al at least slightly, I copy over _indent before I actually construct the message string. So the indent can't change while we add the spaces/tabs to the output.
Definition at line 150 of file CommandLineLogger.cpp.
References assertion.
void tarch::logging::CommandLineLogger::debug | ( | long int | timestampNanoseconds, |
int | rank, | ||
int | threadId, | ||
const std::string & | trace, | ||
const std::string & | message ) |
Definition at line 196 of file CommandLineLogger.cpp.
References assertion, and tarch::logging::LogFilter::FilterListEntry::TargetDebug.
Referenced by kernel_impl.impl::alloc(), kernel_impl.impl::loop(), and kernel_impl.impl::stencil().
void tarch::logging::CommandLineLogger::error | ( | long int | timestampNanoseconds, |
int | rank, | ||
int | threadId, | ||
const std::string & | trace, | ||
const std::string & | message ) |
Write Error.
In the implementation, I call a flush on cout before I write to cerr. Otherwise, the cerr messages might overtake cout. Before the operation returns, it does a flush on cerr, too. Otherwise, the message might not occur, i.e. the application might shut down before the message is flushed to the terminal.
Definition at line 242 of file CommandLineLogger.cpp.
References tarch::mpi::Rank::abort().
|
static |
Definition at line 51 of file CommandLineLogger.cpp.
Referenced by main(), runParallel(), and runSerial().
|
private |
Definition at line 392 of file CommandLineLogger.cpp.
bool tarch::logging::CommandLineLogger::getLogMachineName | ( | ) | const |
Is public as some analysis frameworks check explicitly whether these features are switched on.
Definition at line 407 of file CommandLineLogger.cpp.
|
private |
Definition at line 417 of file CommandLineLogger.cpp.
bool tarch::logging::CommandLineLogger::getLogThreadName | ( | ) | const |
Is public as some analysis frameworks check explicitly whether these features are switched on.
Definition at line 412 of file CommandLineLogger.cpp.
bool tarch::logging::CommandLineLogger::getLogTimeStamp | ( | ) | const |
Is public as some analysis frameworks check explicitly whether these features are switched on.
Definition at line 397 of file CommandLineLogger.cpp.
|
private |
Definition at line 402 of file CommandLineLogger.cpp.
bool tarch::logging::CommandLineLogger::getLogTrace | ( | ) | const |
Is public as some analysis frameworks check explicitly whether these features are switched on.
Definition at line 422 of file CommandLineLogger.cpp.
|
staticprivate |
timestampNanoseconds | Time stamp given in milliseconds |
Definition at line 120 of file CommandLineLogger.cpp.
void tarch::logging::CommandLineLogger::indent | ( | bool | indent, |
const std::string & | trace, | ||
const std::string & | message ) |
Tells the logger to increment/decrement the indent.
!!! Thread Safety
_indent is a global static field shared by all threads. If we increment or decrement it, this is first of all a read followed by a write. Consequently data races could occur and the counter could become smaller than zero. This ain't possible in the sequential code as each increment is accompanied by a decrement. The following table illustrates the race:
|| value of _indent || Thread 1 || Thread 2 | 2 | initial condition | initial condition | | enter indent(false) | enter indent(true) | | fetch indent into register | fetch indent into register | | register value -= 2 | register value += 2 | 4 | is a little bit slower | write back new value of indent | 0 | write back new value of indent |
To avoid this data race, I introduced a semaphore. This one could also be implemented with TBB's atomic construct, e.g., but I prefer the semaphor / critical section technique.
trace | Needed in debug mode to be able to find out who called indent(false) without an indent(true) |
message | Needed in debug mode to be able to find out who called indent(false) without an indent(true) |
Definition at line 286 of file CommandLineLogger.cpp.
References assertion3, assertion5, assertionEquals2, and tarch::multicore::Core::getInstance().
Referenced by printers.cpp_printer::alloc(), kernel_impl.impl::alloc(), printers.cpp_printer::loop(), kernel_impl.impl::loop(), and kernel_impl.impl::stencil().
void tarch::logging::CommandLineLogger::info | ( | long int | timestampNanoseconds, |
int | rank, | ||
int | threadId, | ||
const std::string & | trace, | ||
const std::string & | message ) |
Definition at line 212 of file CommandLineLogger.cpp.
References tarch::logging::LogFilter::FilterListEntry::TargetInfo.
|
private |
Declared private since assignment does not make sense for an output class (output information mismatch).
Definition at line 74 of file CommandLineLogger.cpp.
|
private |
Definition at line 56 of file CommandLineLogger.cpp.
|
private |
Definition at line 322 of file CommandLineLogger.cpp.
void tarch::logging::CommandLineLogger::setLogColumnSeparator | ( | const std::string & | separator = " " | ) |
Definition at line 427 of file CommandLineLogger.cpp.
Referenced by CommandLineLogger().
void tarch::logging::CommandLineLogger::setLogFormat | ( | const std::string & | columnSeparator, |
bool | logTimeStamp, | ||
bool | logTimeStampHumanReadable, | ||
bool | logMachineName, | ||
bool | logThreadName, | ||
bool | logMessageType, | ||
bool | logTrace, | ||
const std::string & | outputLogFileName ) |
outputLogFileName | If this argument is not the empty string, the logger pipes all debug data into a file and not to the terminal anymore. |
Definition at line 370 of file CommandLineLogger.cpp.
Definition at line 442 of file CommandLineLogger.cpp.
Referenced by CommandLineLogger().
Definition at line 452 of file CommandLineLogger.cpp.
Referenced by CommandLineLogger().
Definition at line 447 of file CommandLineLogger.cpp.
Referenced by CommandLineLogger().
Definition at line 432 of file CommandLineLogger.cpp.
Referenced by CommandLineLogger().
Definition at line 437 of file CommandLineLogger.cpp.
Referenced by CommandLineLogger().
Definition at line 457 of file CommandLineLogger.cpp.
Referenced by CommandLineLogger().
void tarch::logging::CommandLineLogger::setOutputFile | ( | const std::string & | outputLogFileName | ) |
Is redundant, as you could use setLogFormat() instead.
However, it is tedious to specify all of these parameters if the only thing you want is to establish an output file.
Definition at line 352 of file CommandLineLogger.cpp.
References tarch::mpi::Rank::getInstance(), and tarch::mpi::Rank::getRank().
Referenced by main().
Definition at line 462 of file CommandLineLogger.cpp.
void tarch::logging::CommandLineLogger::traceIn | ( | long int | timestampNanoseconds, |
int | rank, | ||
int | threadId, | ||
const std::string & | trace, | ||
const std::string & | message ) |
Definition at line 262 of file CommandLineLogger.cpp.
void tarch::logging::CommandLineLogger::traceOut | ( | long int | timestampNanoseconds, |
int | rank, | ||
int | threadId, | ||
const std::string & | trace, | ||
const std::string & | message ) |
Definition at line 274 of file CommandLineLogger.cpp.
void tarch::logging::CommandLineLogger::warning | ( | long int | timestampNanoseconds, |
int | rank, | ||
int | threadId, | ||
const std::string & | trace, | ||
const std::string & | message ) |
Write Warning.
In the implementation, I call a flush on cout before I write to cerr. Otherwise, the cerr messages might overtake cout. Before the operation returns, it does a flush on cerr, too. Otherwise, the message might not occur, i.e. the application might shut down before the message is flushed to the terminal.
Definition at line 226 of file CommandLineLogger.cpp.
References tarch::logging::LogFilter::FilterListEntry::TargetWarning.
|
private |
Definition at line 67 of file CommandLineLogger.h.
|
staticprivate |
Indent is supported only in debug mode.
Definition at line 87 of file CommandLineLogger.h.
|
private |
Definition at line 160 of file CommandLineLogger.h.
|
private |
Definition at line 68 of file CommandLineLogger.h.
|
staticprivate |
Definition at line 50 of file CommandLineLogger.h.
|
private |
Test for the column separator of a string output.
Definition at line 59 of file CommandLineLogger.h.
|
private |
Definition at line 62 of file CommandLineLogger.h.
|
private |
Definition at line 64 of file CommandLineLogger.h.
|
private |
Definition at line 63 of file CommandLineLogger.h.
|
private |
Definition at line 60 of file CommandLineLogger.h.
|
private |
Definition at line 61 of file CommandLineLogger.h.
|
private |
Definition at line 65 of file CommandLineLogger.h.
|
private |
Definition at line 69 of file CommandLineLogger.h.
|
private |
Definition at line 66 of file CommandLineLogger.h.
|
private |
Definition at line 70 of file CommandLineLogger.h.
|
private |
Definition at line 54 of file CommandLineLogger.h.
|
staticprivate |
Definition at line 52 of file CommandLineLogger.h.
|
staticprivate |
Definition at line 108 of file CommandLineLogger.h.
|
staticprivate |
Definition at line 92 of file CommandLineLogger.h.
|
staticprivate |
Definition at line 97 of file CommandLineLogger.h.
|
staticprivate |
The trace column is not formatted using only tabulators, but it uses spaces to create a unique column size: First, TRACE_SPACE_NUMBER-n spaces are added if n is the length of the original string, then a \t is appended.
This message augmentation is done only, if the Debug-mode is set.
Definition at line 106 of file CommandLineLogger.h.