// $Id$
//
-// Copyright (C) 2007
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
#include "../mpl.hh"
#include "StreamRegistry.hh"
#include "AreaRegistry.hh"
+#include "../Exception.hh"
//#include "Target.mpp"
///////////////////////////////hh.p////////////////////////////////////////
namespace senf {
namespace log {
-
- class TargetRegistry;
+
+ namespace detail { class TargetRegistry; }
/** \brief Logging target base class
- Targets are the final destination of log messages. Every message is eventually routed to one
+ Targets are the final destination of %log messages. Every message is eventually routed to one
or several targets.
\section target_routing Routing
The different object representations are:
\li The \e streams is statically represented by it's name, which is the name of a class
- defined with \ref SENF_LOG_DEF_STREAM. The dynamic representation is a string
+ defined with \ref SENF_LOG_DEFINE_STREAM. The dynamic representation is a string
representation of this name.
\li The \e area is statically represented by it's name, which again is the name of a class
- defined with \ref SENF_LOG_DEF_STREAM. The dynamic representation again is a string
+ defined with \ref SENF_LOG_DEFINE_STREAM. The dynamic representation again is a string
representation of this class's name. The dynamic representation represents an absent
area with the empty string.
\li The \e level is statically represented by a level class from \ref
The target may process in any arbitrary way: reformat, writing it into an SQL DB, whatever
can be envisioned. However, there is one important limitation: The \c v_write call must not
- block. So for more complex scenarios, additional measures must be taken (e.g. writing a log
+ block. So for more complex scenarios, additional measures must be taken (e.g. writing a %log
backend daemon which receives the messages via UDP and processes them). Of course, in rare
cases messages might be lost but this cannot be avoided.
\see \ref targets
-
- \fixme optionally Integrate with Scheduler / ClockService to reduce number of gettimeofday()
- calls.
*/
class Target : private boost::noncopyable
{
See the class description for information on the \a
action and \a index parameters
- \param[in] Stream mandatory stream to match
- \param[in] Area optional area to match
- \param[in] Level optional level, matches messages with
+ \tparam Stream mandatory stream to match
+ \tparam Area optional area to match
+ \tparam Level optional level, matches messages with
at least the given level.
\param[in] action routing action to take
\param[in] index position of new route in the routing
found, it will be removed, otherwise the call will be
ignored
- \param[in] Stream mandatory stream to match
- \param[in] Area optional area to match
- \param[in] Level optional level, matches messages with
+ \tparam Stream mandatory stream to match
+ \tparam Area optional area to match
+ \tparam Level optional level, matches messages with
at least the given level.
\param[in] action routing action to take */
///\}
/** \brief Exception: Invalid stream */
- struct InvalidStreamException : public std::exception
- { virtual char const * what() const throw()
- { return "senf::log::Target::InvalidStreamException"; } };
+ struct InvalidStreamException : public senf::Exception
+ { InvalidStreamException()
+ : senf::Exception("senf::log::Target::InvalidStreamException"){} };
/** \brief Exception: Invalid area */
- struct InvalidAreaException : public std::exception
- { virtual char const * what() const throw()
- { return "senf::log::Target::InvalidAreaException"; } };
+ struct InvalidAreaException : public senf::Exception
+ { InvalidAreaException()
+ : senf::Exception("senf::log::Target::InvalidAreaException"){} };
iterator begin() const; ///< Iterator to beginning of routing table
iterator end() const; ///< Iterator past the end of routing table
std::string const & message) = 0;
///< Called to write out the routing message
/**< This member must be defined in the derived class to
- somehow format and write the log message.
+ somehow format and write the %log message.
- Every log message always possesses a complete set of
+ Every %log message always possesses a complete set of
meta information (\a stream, \a area and \a level).
\note This member must \e not block since it may be
simple logging over NFS or many other network
protocols.
- \param[in] timestamp log message timing information
+ \param[in] timestamp %log message timing information
\param[in] stream message stream
\param[in] area message area
\param[in] level message level
RIB rib_;
friend class detail::AreaBase;
+ friend class detail::TargetRegistry;
+ };
+
+ /** \brief Log message time source abstract base class
+
+ Instances derived from TimeSource provide the Logging library with the current date/time
+ value. The \c operator() member must be implemented to return the current universal time
+ (UTC).
+
+ A new TimeSource may be installed using \ref senf::log::timeSource().
+
+ \ingroup config
+ */
+ struct TimeSource
+ {
+ virtual ~TimeSource();
+ virtual boost::posix_time::ptime operator()() const = 0;
+ };
+
+ /** \brief Default %log message time source
+
+ This time source is installed by default and uses gettimeofday() (via the Boost.DateTime
+ library) to get the current universal time.
+
+ \ingroup config
+ */
+ struct SystemTimeSource : public TimeSource
+ {
+ virtual boost::posix_time::ptime operator()() const;
};
+ /** \brief Change %log message time source
+
+ Set the %log message time source to \a source. The logging library will take ownership of \e
+ source and will take care to free it, if necessary.
+
+ Since the time source class will in almost all cases be default constructible, see the
+ template overload for a simpler interface.
+
+ \ingroup config
+ */
+ void timeSource(std::auto_ptr<TimeSource> source);
+
+ /** \brief Change %log message time source
+
+ Set the %log message time source to (an instance of) \a Source. \a Source must be default
+ constructible, otherwise use the non-template senf::log::timeSource() overload.
+
+ \ingroup config
+ */
+ template <class Source> void timeSource();
+
}}
///////////////////////////////hh.e////////////////////////////////////////