X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FLogger%2FConfig.hh;h=9f0f73541b202cc46897aad2b559ff02446f098c;hb=412024ed31a4ab4eaea7a4165a434f8efebee325;hp=34566b13f50d52a395a57f03045e788dc05ea712;hpb=ac90835cbb00ca83a51ab9efb23fdcb75518e808;p=senf.git diff --git a/Utils/Logger/Config.hh b/Utils/Logger/Config.hh index 34566b1..9f0f735 100644 --- a/Utils/Logger/Config.hh +++ b/Utils/Logger/Config.hh @@ -23,8 +23,8 @@ /** \file \brief Config public header */ -#ifndef HH_Config_ -#define HH_Config_ 1 +#ifndef HH_SENF_Utils_Logger_Config_ +#define HH_SENF_Utils_Logger_Config_ 1 // Custom includes #include "Levels.hh" @@ -54,16 +54,16 @@
     g++ ... -DSENF_LOG_CONF="(( (senf)(log)(Debug),(_),DISABLED ))
                              (( (senf)(log)(Debug),(foo)(SomeClass),VERBOSE ))
-                             (( (foo)(Transactions),(_),NOTICE ))" ...
+                             (( (_),(_),NOTICE ))" ...
     
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. + 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. + the \c senf::log::Debug stream to \c DISABLED. It enables debug logging only within the \c + foo::SomeClass area, where it is set to \c VERBOSE. Lastly, the global compile time limit is set + to \c NOTICE. There are two standard uses for this configuration: Either to disable most logging in final builds by changing the compile time limit to something like senf::log::IMPORTANT or to enable @@ -76,6 +76,20 @@ g++ ... -DSENF_LOG_CONF="(( (senf)(log)(Verbose), (some)(Area), VERBOSE ))" + All the entries specified via \c SENF_LOG_CONF are applied in a fixed order: + + \li First the entries which have both a stream and an area specified are checked + \li next all entries with area but no stream given are checked + \li followed by all entries with a given stream but no area + \li and lastly if no match was found until now, a generic entry without stream and area is + checked + \li if no matching entry is found, the default compile time limit of the stream is used + + So an area specification has precedence over a stream specification. + + \warning Enabling a message at compile time does \e not ensure, the message is shown. You + additionally need to \e route the message (see next chapter). This is especially true for \c + VERBOSE messages, which are default disabled at runtime. \see \ref SENF_LOG_CONF @@ -83,8 +97,8 @@ The runtime configuration is performed by routing messages to one or more logging targets: \code - senf::log::ConsoleLog & consoleLog (senf::log::ConsoleLog::instance()); - senf::log::FileLog fileLog ("my.log"); + senf::log::ConsoleTarget & consoleLog (senf::log::ConsoleTarget::instance()); + senf::log::FileTarget fileLog ("my.log"); consoleLog.route(); consoleLog.route(senf::log::Target::REJECT); @@ -100,6 +114,10 @@ The routing statements are processed by the targets in order, the first matching rule will decide a log messages fate for that target. + \warning You can \e only route those messages at runtime which have been compile-time + enabled. By default, \c VERBOSE messages are \e disabled at compile time. They must be + enabled \e explicitly by setting \c SENF_LOG_CONF so they can be routed. + \section config_fallback Fallback routing There are two cases, where this setup may lead to inadvertently lost log messages: @@ -147,28 +165,30 @@ namespace log { \par "" - - - - - - - - + + + + + + + +
conf ::= \e element \e element* \n
element ::= (( \e stream , \e optional_area , \e level )) \n
stream ::= \e scope_seq \n
optional_area::= (_) | \e scope_seq \n
level ::= \c VERBOSE | \c NOTICE | \c MESSAGE | \c IMPORTANT | \c CRITICAL | \c DISABLED \n
scope_seq ::= \e scope \e scope* \n
scope ::= ( \e name ) \n
name ::= arbitrary C++ identifier
conf ::= \e element \e element* \n
element ::= (( \e optional_stream , \e optional_area , \e level )) \n
optional_stream ::= (_) | \e scope_seq \n
optional_area ::= (_) | \e scope_seq \n
level ::= \c VERBOSE | \c NOTICE | \c MESSAGE | \c IMPORTANT | \c CRITICAL | \c DISABLED \n
scope_seq ::= \e scope \e scope* \n
scope ::= ( \e name ) \n
name ::= arbitrary C++ identifier
- \ref SENF_LOG_CONF is a Boost.Preprocessor style sequence of 3-tuples. Each tuple applies to - a specific stream which is defined by the first tuple element \e stream. + \ref SENF_LOG_CONF is a Boost.Preprocessor style sequence of 3-tuples. + + The first tuple element \e optional_stream specifies the stream to match. If this is + (_), the entry will match any stream. The next tuple element, \e optional_area optionally restricts the entry to match only the - given area. + given area. If set to (_), the area is left unrestricted. The last tuple element \e level defines the compile time log level. Messages with a level below this are discarded at compile time. - Both \e stream and \e optional_area are given as a \e scope_seq. A scope sequence is a fully - qualified C++ identifier placed into a sequence: foo::bar::baz is represented by - (foo)(bar)(baz). + Both \e optional_stream and \e optional_area are given as a \e scope_seq. A scope sequence + is a fully qualified C++ identifier placed into a sequence: foo::bar::baz is + represented by (foo)(bar)(baz). */ # define SENF_LOG_CONF