X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FLogger%2FSyslogUDPTarget.cc;h=cd8d6b3bc7c4e47752e28a99b9963dcaf26eb225;hb=81f84badf27b66dbadec9890646ca1193e998505;hp=0538fe070aae4a34b564264aea72b56c54d7864d;hpb=07b8c0784c854893cd1a4ecb9aa051a625ebe17e;p=senf.git diff --git a/Utils/Logger/SyslogUDPTarget.cc b/Utils/Logger/SyslogUDPTarget.cc index 0538fe0..cd8d6b3 100644 --- a/Utils/Logger/SyslogUDPTarget.cc +++ b/Utils/Logger/SyslogUDPTarget.cc @@ -30,11 +30,31 @@ #include #include #include +#include "../Console/Console.hh" //#include "SyslogUDPTarget.mpp" #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// +prefix_ void senf::log::SyslogUDPTarget::init() +{ + namespace kw = senf::console::kw; + + consoleDir().remove("format"); + consoleDir().add("format", senf::membind(&SyslogUDPTarget::consoleFormat, this)) + .doc("Show the current log message format."); + consoleDir().add("syslog", senf::membind( + static_cast(&SyslogUDPTarget::syslog), + this)) + .arg("flag","new syslog format state", + kw::default_value=true) + .doc("Change the syslog format flag. By default, syslog formating is enabled. In this\n" + "state, the udp target will send out minimal but valid syslog format messages.\n" + "\n" + "Disabling syslog format will remove the syslog prefix. Log messages will then be\n" + "sent using plain UDP."); +} + prefix_ void senf::log::SyslogUDPTarget::v_write(time_type timestamp, std::string const & stream, std::string const & area, unsigned level, std::string const & message) @@ -44,8 +64,12 @@ prefix_ void senf::log::SyslogUDPTarget::v_write(time_type timestamp, std::strin detail::quoteNonPrintable(m); std::stringstream prfstream; - prfstream << '<' << (facility_ | senf::log::SyslogTarget::LEVELMAP[level]) << "> " - << prefix(timestamp, stream, area, level); + // The space after the '>' is there on purpose: It ensures, that the prefix (which may be empty) + // or message will not inadvertently be interpreted as date or hostname by a receiving syslog + // daemon or proxy + if (syslogFormat_) + prfstream << '<' << (facility_ | senf::log::SyslogTarget::LEVELMAP[level]) << "> "; + prfstream << prefix(timestamp, stream, area, level); std::string const & prf (prfstream.str()); typedef boost::char_separator Separator; @@ -65,6 +89,110 @@ prefix_ void senf::log::SyslogUDPTarget::v_write(time_type timestamp, std::strin } } +prefix_ void senf::log::SyslogUDPTarget::consoleFormat(std::ostream & os) +{ + LogFormat::consoleFormat(os); + os << "syslog prefix " << (syslogFormat_ ? "enabled" : "disabled") << "\n"; +} + +namespace senf { +namespace log { + + SENF_CONSOLE_REGISTER_ENUM_MEMBER(SyslogUDPTarget, LogFacility, + (AUTHPRIV)(CRON)(DAEMON)(FTP)(KERN)(LPR)(MAIL)(NEWS)(SYSLOG) + (USER)(UUCP)(LOCAL0)(LOCAL1)(LOCAL2)(LOCAL3)(LOCAL4)(LOCAL5) + (LOCAL6)(LOCAL7)); + +}} + +prefix_ senf::log::SyslogUDPTarget::RegisterConsole::RegisterConsole() +{ + namespace kw = senf::console::kw; + + detail::TargetRegistry::instance().consoleDir().add( + "udp-target", + static_cast( + &RegisterConsole::create)) + .arg("address", "target address to send log messages to") + .arg("facility", "syslog facility to send messages to. One of\n" + " AUTHPRIV CRON DAEMON FTP KERN LPR MAIL NEWS SYSLOG USER\n" + " UUCP LOCAL0 LOCAL1 LOCAL2 LOCAL3 LOCAL4 LOCAL5 LOCAL6 LOCAL7", + kw::default_value = USER) + .doc("Create new udp target. The {address} can be an IPv4 or IPv6 address. If the port\n" + "number is omitted, it defaults to the default syslog port 514. Examples:\n" + "\n" + "Create new udp target sending messages to the syslog daemon running at localhost\n" + " $ udp-target localhost\n" + " \n" + "\n" + "In a configuration file, create new udp target and set some parameters (If\n" + "written on one line, this works at the console too:\n" + " /sys/log/udp-target localhost:2345 LOCAL2 {\n" + " route (IMPORTANT); # route all important messages\n" + " timeFormat \"\"; # use non-formatted time format\n" + " showArea false; # don't show log area\n" + " syslog false; # no syslog format, just plain udp\n" + " }\n"); + detail::TargetRegistry::instance().consoleDir().add( + "udp-target", + static_cast( + &RegisterConsole::create)) + .arg("address") + .arg("facility", kw::default_value = USER); + detail::TargetRegistry::instance().consoleDir().add( + "udp-target", + static_cast( + &RegisterConsole::create)) + .arg("address") + .arg("facility", kw::default_value = USER); + detail::TargetRegistry::instance().consoleDir().add( + "udp-target", + static_cast( + &RegisterConsole::create)) + .arg("address") + .arg("facility", kw::default_value = USER); +} + +prefix_ boost::shared_ptr +senf::log::SyslogUDPTarget::RegisterConsole::create(senf::INet4SocketAddress const & target, + LogFacility facility) +{ + std::auto_ptr tp (new SyslogUDPTarget(target, facility)); + Target & tg (*tp.get()); + detail::TargetRegistry::instance().dynamicTarget(tp); + return tg.consoleDir().node().thisptr(); +} + +prefix_ boost::shared_ptr +senf::log::SyslogUDPTarget::RegisterConsole::create(senf::INet4Address const & target, + LogFacility facility) +{ + std::auto_ptr tp (new SyslogUDPTarget(target, facility)); + Target & tg (*tp.get()); + detail::TargetRegistry::instance().dynamicTarget(tp); + return tg.consoleDir().node().thisptr(); +} + +prefix_ boost::shared_ptr +senf::log::SyslogUDPTarget::RegisterConsole::create(senf::INet6SocketAddress const & target, + LogFacility facility) +{ + std::auto_ptr tp (new SyslogUDPTarget(target, facility)); + Target & tg (*tp.get()); + detail::TargetRegistry::instance().dynamicTarget(tp); + return tg.consoleDir().node().thisptr(); +} + +prefix_ boost::shared_ptr +senf::log::SyslogUDPTarget::RegisterConsole::create(senf::INet6Address const & target, + LogFacility facility) +{ + std::auto_ptr tp (new SyslogUDPTarget(target, facility)); + Target & tg (*tp.get()); + detail::TargetRegistry::instance().dynamicTarget(tp); + return tg.consoleDir().node().thisptr(); +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "SyslogUDPTarget.mpp"