X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FLogger%2FTarget.hh;h=e371443f2eb48f692ebfc15b3d80d9a337fbf13f;hb=8da6e83b001f0ae8383af7eb4b3e3a079178a777;hp=2190ed5de27e9e888eff78c753f5c6caab03c822;hpb=412024ed31a4ab4eaea7a4165a434f8efebee325;p=senf.git diff --git a/Utils/Logger/Target.hh b/Utils/Logger/Target.hh index 2190ed5..e371443 100644 --- a/Utils/Logger/Target.hh +++ b/Utils/Logger/Target.hh @@ -36,6 +36,7 @@ #include "StreamRegistry.hh" #include "../Exception.hh" #include "TimeSource.hh" +#include "../Console/LazyDirectory.hh" //#include "Target.mpp" ///////////////////////////////hh.p//////////////////////////////////////// @@ -52,12 +53,13 @@ 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. @@ -115,7 +117,7 @@ namespace log { \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 @@ -136,7 +138,7 @@ namespace log { 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 */ }; @@ -148,29 +150,29 @@ namespace log { \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; }; @@ -179,12 +181,13 @@ namespace log { 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(); ///@} @@ -212,19 +215,19 @@ namespace log { \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 @@ -234,7 +237,7 @@ namespace log { 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 @@ -251,7 +254,7 @@ namespace log { # ifdef DOXYGEN - template + template void unroute(action_t action = ACCEPT); ///< Remove route (static) /**< This member removes an arbitrary routing entry. The @@ -266,12 +269,12 @@ namespace log { \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 @@ -291,9 +294,9 @@ namespace log { \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 */ @@ -321,21 +324,31 @@ namespace log { /** \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 + + protected: + 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); @@ -343,16 +356,20 @@ namespace log { 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). @@ -373,11 +390,18 @@ namespace log { # 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//////////////////////////////////////// @@ -386,7 +410,7 @@ namespace log { #include "Target.cti" #endif - + // Local Variables: // mode: c++ // fill-column: 100