/** \file
\brief Target public header */
-#ifndef HH_Target_
-#define HH_Target_ 1
+#ifndef HH_SENF_Utils_Logger_Target_
+#define HH_SENF_Utils_Logger_Target_ 1
// Custom includes
#include <set>
#include "StreamRegistry.hh"
#include "../Exception.hh"
#include "TimeSource.hh"
+#include "../Console/LazyDirectory.hh"
//#include "Target.mpp"
///////////////////////////////hh.p////////////////////////////////////////
namespace senf {
namespace log {
-
+
namespace detail { class TargetRegistry; }
namespace detail { class AreaBase; }
+ namespace detail { struct LogParameters; }
/** \brief Logging target base class
-
+
Targets are the final destination of %log messages. Every message is eventually routed to
one or several targets.
\section target_impl Implementing new targets
To implement a new target type, you need to derive from senf::log::Target and implement the
- single \c v_write member. This member will be called whenever a message should be output.
+ single \c v_write member. This member will be called whenever a message should be output.
The target may process the message in any arbitrary way: reformat it, write it into an SQL
DB, whatever can be envisioned. However, there is one important limitation: The \c v_write
Every routing entry is associated with a routing action. This action is final (for this
target. Each target is processed independently).
*/
- enum action_t {
+ enum action_t {
ACCEPT /** Output message */
, REJECT /** Suppress message output */
};
\see senf::log::Target
*/
- struct RoutingEntry
+ struct RoutingEntry
{
std::string stream() const; ///< Stream to match
std::string area() const; ///< Area to match (empty of unspecified)
unsigned level() const; ///< Level to match (senf::log::NONE::value if unspecified)
action_t action() const; ///< Action to take
-
+
# ifdef DOXYGEN
private:
# endif
RoutingEntry();
- bool operator==(RoutingEntry const & other);
+ bool operator==(RoutingEntry const & other) const;
private:
- RoutingEntry(detail::StreamBase const * stream, detail::AreaBase const * area,
+ RoutingEntry(detail::StreamBase const * stream, detail::AreaBase const * area,
unsigned level, action_t action);
detail::StreamBase const * stream_;
detail::AreaBase const * area_;
unsigned level_;
action_t action_;
-
+
friend class Target;
};
public:
typedef RIB::const_iterator iterator; ///< Routing table iterator
+ typedef RIB::size_type size_type;
///////////////////////////////////////////////////////////////////////////
///\name Structors and default members
///@{
- Target();
+ explicit Target(std::string const & name);
virtual ~Target();
///@}
\endcode
See the class description for information on the \a
- action and \a index parameters
+ action and \a index parameters
\tparam Stream stream to match
\tparam Area area to match
\tparam Level level, matches messages with
- at least the given level.
+ at least the given level.
\param[in] action routing action to take
\param[in] index position of new route in the routing
table */
# endif
- void route(std::string const & stream, std::string const & area = "",
+ void route(std::string const & stream, std::string const & area = "",
unsigned level = NONE::value, action_t action = ACCEPT, int index = -1);
///< Add route (dynamic)
/**< Add a route for the given combination of \a stream, \a
senf::log::NONE::value respectively.
See the class description for information on the \a
- action and \a index parameters
+ action and \a index parameters
\throws InvalidStreamException if the given \a stream
is not found in the StreamRegistry
# ifdef DOXYGEN
- template <class Stream, class Area, class Level>
+ template <class Stream, class Area, class Level>
void unroute(action_t action = ACCEPT);
///< Remove route (static)
/**< This member removes an arbitrary routing entry. The
\tparam Stream stream to match
\tparam Area area to match
\tparam Level level, matches messages with
- at least the given level.
+ at least the given level.
\param[in] action routing action to take */
# endif
- void unroute(std::string const & stream, std::string const & area = "",
+ void unroute(std::string const & stream, std::string const & area = "",
unsigned level = NONE::value, action_t action = ACCEPT);
///< Remove route (dynamic)
/**< This member removes an arbitrary routing entry. The \a
\param[in] action routing action to take */
void unroute(int index=-1); ///< Remove route (indexed)
/**< This call will remove the route with the given index.
-
+
See the class documentation for more information on
- indexing.
+ indexing.
\param[in] index index of routing entry to remove */
/** \brief Exception: Invalid stream */
struct InvalidStreamException : public senf::Exception
- { InvalidStreamException()
+ { InvalidStreamException()
: senf::Exception("senf::log::Target::InvalidStreamException"){} };
-
+
/** \brief Exception: Invalid area */
struct InvalidAreaException : public senf::Exception
- { InvalidAreaException()
+ { 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
-
+
+ RoutingEntry const & operator[](size_type i) const; ///< Access routing entry
+
+ size_type size() const; ///< Number of routing table entries
+ bool empty() const; ///< \c true, if routing table empty, \c false otherwise
+
+ void flush(); ///< Clear routing table
+
+ senf::console::ScopedDirectory<> & consoleDir(); ///< Get console/config directory
+
private:
- void route(detail::StreamBase const * stream, detail::AreaBase const * area,
+ void route(detail::StreamBase const * stream, detail::AreaBase const * area,
unsigned level, action_t action, int index);
- void unroute(detail::StreamBase const * stream, detail::AreaBase const * area,
+ void unroute(detail::StreamBase const * stream, detail::AreaBase const * area,
unsigned level, action_t action);
void updateRoutingCache(detail::StreamBase const * stream, detail::AreaBase const * area);
void write(time_type timestamp, detail::StreamBase const & stream,
detail::AreaBase const & area, unsigned level, std::string const & message);
+ void consoleList(std::ostream & os);
+ void consoleRoute(int index, detail::LogParameters const & pm, action_t action);
+ void consoleUnroute(detail::LogParameters const & pm, action_t action);
+
# ifdef DOXYGEN
protected:
# endif
- virtual void v_write(time_type timestamp, std::string const & stream,
- std::string const & area, unsigned level,
+ virtual void v_write(time_type timestamp, std::string const & stream,
+ std::string const & area, unsigned level,
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
meta information (\a stream, \a area and \a level).
# endif
RIB rib_;
-
+
+ console::LazyDirectory consoleDir_;
+
friend class detail::AreaBase;
friend class detail::TargetRegistry;
};
+ /** \brief Write route action
+ \related Target
+ */
+ std::ostream & operator<<(std::ostream & os, Target::action_t const & action);
+
}}
///////////////////////////////hh.e////////////////////////////////////////
#include "Target.cti"
#endif
-\f
+
// Local Variables:
// mode: c++
// fill-column: 100