Socket/Protocols/Raw: EUI64 documentation
[senf.git] / Utils / Logger / SyslogUDPTarget.cc
index af8da40..cd8d6b3 100644 (file)
 #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<void (SyslogUDPTarget::*)(bool)>(&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)
@@ -48,8 +67,9 @@ prefix_ void senf::log::SyslogUDPTarget::v_write(time_type timestamp, std::strin
     // 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
-    prfstream << '<' << (facility_ | senf::log::SyslogTarget::LEVELMAP[level]) << "> "
-              << prefix(timestamp, stream, area, level);
+    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<char> Separator;
@@ -69,6 +89,12 @@ 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 {
 
@@ -84,62 +110,87 @@ prefix_ senf::log::SyslogUDPTarget::RegisterConsole::RegisterConsole()
     namespace kw = senf::console::kw;
 
     detail::TargetRegistry::instance().consoleDir().add(
-        "udp-target", static_cast<void (*)(INet4SocketAddress const &, LogFacility)>(
+        "udp-target", 
+        static_cast<senf::console::DirectoryNode::ptr (*)(INet4SocketAddress const &, LogFacility)>(
             &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",
+             "                  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.");
+             "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"
+             "    <Directory '/sys/log/udp-127.0.0.1:514'>\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<void (*)(INet4Address const &, LogFacility)>(
+        "udp-target", 
+        static_cast<senf::console::DirectoryNode::ptr (*)(INet4Address const &, LogFacility)>(
             &RegisterConsole::create))
         .arg("address")
         .arg("facility", kw::default_value = USER);
     detail::TargetRegistry::instance().consoleDir().add(
-        "udp-target", static_cast<void (*)(INet6SocketAddress const &, LogFacility)>(
+        "udp-target", 
+        static_cast<senf::console::DirectoryNode::ptr (*)(INet6SocketAddress const &, LogFacility)>(
             &RegisterConsole::create))
         .arg("address")
         .arg("facility", kw::default_value = USER);
     detail::TargetRegistry::instance().consoleDir().add(
-        "udp-target", static_cast<void (*)(INet6Address const &, LogFacility)>(
+        "udp-target", 
+        static_cast<senf::console::DirectoryNode::ptr (*)(INet6Address const &, LogFacility)>(
             &RegisterConsole::create))
         .arg("address")
         .arg("facility", kw::default_value = USER);
 }
 
-prefix_ void
+prefix_ boost::shared_ptr<senf::console::DirectoryNode>
 senf::log::SyslogUDPTarget::RegisterConsole::create(senf::INet4SocketAddress const & target,
                                                     LogFacility facility)
 {
-    detail::TargetRegistry::instance().dynamicTarget(
-        std::auto_ptr<Target>(new SyslogUDPTarget(target, facility)));
+    std::auto_ptr<Target> tp (new SyslogUDPTarget(target, facility));
+    Target & tg (*tp.get());
+    detail::TargetRegistry::instance().dynamicTarget(tp);
+    return tg.consoleDir().node().thisptr();
 }
 
-prefix_ void
+prefix_ boost::shared_ptr<senf::console::DirectoryNode>
 senf::log::SyslogUDPTarget::RegisterConsole::create(senf::INet4Address const & target,
                                                     LogFacility facility)
 {
-    detail::TargetRegistry::instance().dynamicTarget(
-        std::auto_ptr<Target>(new SyslogUDPTarget(target, facility)));
+    std::auto_ptr<Target> tp (new SyslogUDPTarget(target, facility));
+    Target & tg (*tp.get());
+    detail::TargetRegistry::instance().dynamicTarget(tp);
+    return tg.consoleDir().node().thisptr();
 }
 
-prefix_ void
+prefix_ boost::shared_ptr<senf::console::DirectoryNode>
 senf::log::SyslogUDPTarget::RegisterConsole::create(senf::INet6SocketAddress const & target,
                                                     LogFacility facility)
 {
-    detail::TargetRegistry::instance().dynamicTarget(
-        std::auto_ptr<Target>(new SyslogUDPTarget(target, facility)));
+    std::auto_ptr<Target> tp (new SyslogUDPTarget(target, facility));
+    Target & tg (*tp.get());
+    detail::TargetRegistry::instance().dynamicTarget(tp);
+    return tg.consoleDir().node().thisptr();
 }
 
-prefix_ void
+prefix_ boost::shared_ptr<senf::console::DirectoryNode>
 senf::log::SyslogUDPTarget::RegisterConsole::create(senf::INet6Address const & target,
                                                     LogFacility facility)
 {
-    detail::TargetRegistry::instance().dynamicTarget(
-        std::auto_ptr<Target>(new SyslogUDPTarget(target, facility)));
+    std::auto_ptr<Target> tp (new SyslogUDPTarget(target, facility));
+    Target & tg (*tp.get());
+    detail::TargetRegistry::instance().dynamicTarget(tp);
+    return tg.consoleDir().node().thisptr();
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////