<em>Runtime</em> configuration on the other hand deals with routing all those messages, which
are enabled at compile time to the logging targets. If a message is not routed, it will be
- discarded. This allows to additionally disable messages at run-time.
+ discarded. This allows to additionally disable messages at run-time. Message routing is managed
+ via the \ref Target interface.
+
+ \section config_compile Compile time configuration
+
+ Compile time configuration is set on the compiler command line:
+ <pre>
+ g++ ... -DSENF_LOG_CONF="(( (senf)(log)(Debug),(_),DISABLED ))
+ (( (senf)(log)(Debug),(foo)(SomeClass),VERBOSE ))
+ (( (foo)(Transactions),(_),NOTICE ))" ...
+ </pre>
+ The value is relatively complex; It's a Boost.Preprocessor style sequence of tuples, of which
+ the first and second elements are again sequences. What this boils down to, is that it allows to
+ configure compile time logging limits based on stream and optional area.
+
+ The above example disables all debug logging by setting the default log limit for all areas on
+ the \c senf::log::Debug stream to \c DISABLED. It then re-enables debug logging only within the
+ \c foo::SomeClass area, where it is set to \c VERBOSE. Furthermore, the limit on the \c
+ foo::Transactions stream is set to \c NOTICE.
+
+ \see \ref SENF_LOG_CONF
+
+ \section config_runtime Runtime configuration
+
+ The runtime configuration is performed by routing messages to one or more logging targets:
+ \code
+ senf::log::ConsoleLog consoleLog;
+ senf::log::FileLog fileLog ("my.log");
+
+ consoleLog.route<senf::log::Debug>();
+ consoleLog.route<foo::Transactions, foo::SomeClass>(senf::log::Target::REJECT);
+ consoleLog.route<foo::Transactions, senf::log::IMPORTANT>();
+
+ fileLog.route<foo::Transactions>();
+ \endcode Here we see an already relatively complex setup: All debug messages (that is, those,
+ which are not disabled at compile time) are routed to the console. We also route important
+ transactions to the console \e except transactions from the \c foo::SomeClass area. The \c
+ fileLog simply receives all transaction log messages.
+
+ The routing statements are processed by the targets in order, the first matching rule will
+ decide a log messages fate for that target.
+
+ \see \ref senf::log::Target
+
+ \section config_timesource Log message timing
+
+ One auxiliary aspect of logging is message timing. Each message is stamped with a time-stamp
+ giving the exact time the message was created. How the current date/time value is created may be
+ changed by setting a \e TimeSource. A TimeSource is an instance derived from
+ senf::log::TimeSource which will return the current universal time (UTC) when called.
+
+ By default, the logging library will call gettimeofday() for each log message. To change the
+ time source, just pass the new class or instance to senf::log::timeSource:
+ \code
+ // Use senf::Scheduler::instance().eventTime() to time log messages
+ senf::log::timeSource<senf::SchedulerLogTimeSource>();
+ \endcode
*/
namespace senf {
/** \brief Compile time configuration
This define symbol sets the compile time logger configuration. This symbol should normally
- be set on the compiler command line:
- <pre>
- g++ ... -DSENF_LOG_CONF="(( (senf)(log)(Debug),(_),DISABLED ))
- (( (senf)(log)(Debug),(foo)(SomeClass),(VERBOSE) ))
- (( (foo)(Transactions),(_),NOTICE ))" ...
- </pre>
- (As this option can get quite long, you might want to use the '-imacros' option instead)
+ be set on the compiler command line.
The formal syntax of this option is:
struct Enabled
{
static const bool value = (
- (Level::value == senf::log::NONE::value ? Stream::defaultLevel::value : Level::value)
+ (Level::value == NONE::value ? Stream::defaultLevel::value : Level::value)
>= detail::Config<Stream,Area>::compileLimit::value );
};