X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FLogger%2FSyslogUDPTarget.hh;h=71732d5ae9fa8269f973f6c751c5a77193b93dd3;hb=9135a4d83cebb5d4f01cceaf1d8f6ca45cafc7e1;hp=6b7e2693f01416f19036d8baebe9dea2bff38ec5;hpb=204c9c8a9df166f1c220bbd86e1c7a839382c73d;p=senf.git diff --git a/Utils/Logger/SyslogUDPTarget.hh b/Utils/Logger/SyslogUDPTarget.hh index 6b7e269..71732d5 100644 --- a/Utils/Logger/SyslogUDPTarget.hh +++ b/Utils/Logger/SyslogUDPTarget.hh @@ -28,6 +28,7 @@ // Custom includes #include "SyslogTarget.hh" +#include "LogFormat.hh" #include "../../Socket/Protocols/INet/INetAddressing.hh" #include "../../Socket/ClientSocketHandle.hh" #include "../../Socket/FramingPolicy.hh" @@ -42,9 +43,9 @@ namespace log { /** \brief Log target writing UDP syslog packets - The SyslogUDPTarget will send all log messages directly via UDP to a target host. This host - should have a syslog daemon or relay running. The protocol is defined in RFC-3164. + The SyslogUDPTarget will send all %log messages directly via UDP to a target host. This + host should have a syslog daemon or relay running. The protocol is defined in RFC-3164. This log target has some important benefits: @@ -65,7 +66,7 @@ namespace log { the default facility is LOG_USER - The SENF log levels are mapped to syslog levels in the following way: + The SENF %log levels are mapped to syslog levels in the following way: @@ -77,17 +78,19 @@ namespace log {
senf::log::VERBOSE \c LOG_DEBUG
\note Since the UDP syslog packets are limited to 1024 characters and there must be some - space left so a relay may optionally add a timestamp and hostname section, the log - messages are split after 896 characters. Additionally the log messages are split at each + space left so a relay may optionally add a timestamp and hostname section, the %log + messages are split after 896 characters. Additionally the %log messages are split at each newline char since non-printable characters are not allowed. \implementation The RFC only \e recommends the exact message format. This allows us to include the \c PRI part but skip the \c HEADER part (which includes the timestamp and hostname) for better performance. We add a space after the \c PRI to force the syslog daemon to skip the \c HEADER part. + + \ingroup targets */ class SyslogUDPTarget - : public Target + : public Target, private detail::LogFormat { public: /////////////////////////////////////////////////////////////////////////// @@ -105,27 +108,72 @@ namespace log { ///@} /////////////////////////////////////////////////////////////////////////// - void showStream(bool flag = true); - void showLevel(bool flag = true); - void showArea(bool flag = true); + using detail::LogFormat::showTime; + using detail::LogFormat::showStream; + using detail::LogFormat::showLevel; + using detail::LogFormat::showArea; + using detail::LogFormat::timeFormat; + using detail::LogFormat::tag; - void tag(std::string const & tag); + bool syslog() const; ///< \c true, if using syslog format, \c false otherwise + /**< When syslog format is disabled, messages are not + formated as valid syslog messages but sent using plain + UDP. */ + void syslog(bool enabled=true); ///< Set syslog format private: + void init(); void v_write(time_type timestamp, std::string const & stream, std::string const & area, unsigned level, std::string const & message); + void consoleFormat(std::ostream & os); + int facility_; - std::string tag_; typedef senf::ClientSocketHandle< senf::MakeSocketPolicy< senf::DatagramFramingPolicy, senf::ConnectedCommunicationPolicy, senf::WriteablePolicy>::policy > Handle; Handle handle_; - bool showStream_; - bool showLevel_; - bool showArea_; + bool syslogFormat_; + + public: + enum LogFacility { + AUTHPRIV = LOG_AUTHPRIV, + CRON = LOG_CRON, + DAEMON = LOG_DAEMON, + FTP = LOG_FTP, + KERN = LOG_KERN, + LOCAL0 = LOG_LOCAL0, + LOCAL1 = LOG_LOCAL1, + LOCAL2 = LOG_LOCAL2, + LOCAL3 = LOG_LOCAL3, + LOCAL4 = LOG_LOCAL4, + LOCAL5 = LOG_LOCAL5, + LOCAL6 = LOG_LOCAL6, + LOCAL7 = LOG_LOCAL7, + LPR = LOG_LPR, + MAIL = LOG_MAIL, + NEWS = LOG_NEWS, + SYSLOG = LOG_SYSLOG, + USER = LOG_USER, + UUCP = LOG_UUCP + }; + + private: + + struct RegisterConsole { + RegisterConsole(); + static boost::shared_ptr create( + senf::INet4SocketAddress const & target, LogFacility facility = USER); + static boost::shared_ptr create( + senf::INet4Address const & target, LogFacility facility = USER); + static boost::shared_ptr create( + senf::INet6SocketAddress const & target, LogFacility facility = USER); + static boost::shared_ptr create( + senf::INet6Address const & target, LogFacility facility = USER); + static RegisterConsole instance; + }; }; }}