X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FLogger%2FSyslogUDPTarget.hh;h=71732d5ae9fa8269f973f6c751c5a77193b93dd3;hb=b8ca4a544cce3e6023bb56b712a03d6362f2bb79;hp=a025c3ebb67b1fd3afb3b2db789465c8bcac8e74;hpb=adcd3672d48f44103f2b4abc6417acf5d0107978;p=senf.git diff --git a/Utils/Logger/SyslogUDPTarget.hh b/Utils/Logger/SyslogUDPTarget.hh index a025c3e..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,12 +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: /////////////////////////////////////////////////////////////////////////// @@ -100,23 +108,78 @@ namespace log { ///@} /////////////////////////////////////////////////////////////////////////// + using detail::LogFormat::showTime; + using detail::LogFormat::showStream; + using detail::LogFormat::showLevel; + using detail::LogFormat::showArea; + using detail::LogFormat::timeFormat; + using detail::LogFormat::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_; typedef senf::ClientSocketHandle< senf::MakeSocketPolicy< senf::DatagramFramingPolicy, senf::ConnectedCommunicationPolicy, senf::WriteablePolicy>::policy > Handle; Handle handle_; + 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; + }; }; }} ///////////////////////////////hh.e//////////////////////////////////////// -//#include "SyslogUDPTarget.cci" +#include "SyslogUDPTarget.cci" //#include "SyslogUDPTarget.ct" //#include "SyslogUDPTarget.cti" #endif