}
prefix_ void senf::log::Target::unroute(detail::StreamBase const * stream,
- detail::AreaBase const * area, unsigned level,
+ detail::AreaBase const * area, unsigned level,
action_t action)
{
- RIB::iterator i = std::find(rib_.begin(), rib_.end(),
+ RIB::iterator i = std::find(rib_.begin(), rib_.end(),
RoutingEntry(stream, area, level, action));
if (i != rib_.end())
unroute(std::distance(rib_.begin(), i));
{
if (fallbackRouting_) {
if (level >= stream.defaultRuntimeLimit())
- static_cast<Target &>(ConsoleTarget::instance()).v_write(
+ static_cast<Target &>(ConsoleTarget::instance()).v_write(
TimeSource::now(), stream.v_name(), area.v_name(), level, msg );
}
else
area.write( TimeSource::now(), stream, level, msg );
}
+///////////////////////////////////////////////////////////////////////////
+// namespace members
+
+prefix_ std::ostream & senf::log::operator<<(std::ostream & os, senf::log::Target::action_t const & action)
+{
+ if( action == Target::ACCEPT) os << "ACCEPT";
+ else if( action == Target::REJECT) os << "REJECT";
+ else os << "unknown action";
+ return os;
+}
+
///////////////////////////////cc.e////////////////////////////////////////
#undef prefix_
//#include "Target.mpp"
-\f
+
// Local Variables:
// mode: c++
// fill-column: 100
namespace senf {
namespace log {
-
+
namespace detail { class TargetRegistry; }
namespace detail { class AreaBase; }
/** \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
bool operator==(RoutingEntry const & other);
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;
};
\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
-
+
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);
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_;
-
+
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