From d30a92af27eb0e234e591ebb4e6c74044d65239e Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Tue, 3 Mar 2009 08:45:44 +0000
Subject: [PATCH] Utils/Logger: Change FileTarget default console node name to
 file basename Utils/Logger: Add optional console node name argument to
 FileTarget constructor Utils/Logger: Add 'file' console command to FileTarget
 returning the target filename Utils/Logger: Change 'list' console command
 output to be more readable/consistent

---
 Utils/Console/Executor.cc  |  4 ++--
 Utils/Exception.hh         |  2 +-
 Utils/Logger/FileTarget.cc | 37 ++++++++++++++++++++++++-------------
 Utils/Logger/FileTarget.hh |  4 ++--
 Utils/Logger/Target.cc     |  4 ++--
 5 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/Utils/Console/Executor.cc b/Utils/Console/Executor.cc
index e464906e3..1a93b6e95 100644
--- a/Utils/Console/Executor.cc
+++ b/Utils/Console/Executor.cc
@@ -340,10 +340,10 @@ senf::console::Executor::traverseDirectory(ParseCommandInfo::TokensRange const &
         }
     }
     catch (std::bad_cast &) {
-        throw InvalidDirectoryException();
+        throw InvalidDirectoryException(errorPath);
     }
     catch (UnknownNodeNameException &) {
-        throw InvalidDirectoryException();
+        throw InvalidDirectoryException(errorPath);
     }
 }
 
diff --git a/Utils/Exception.hh b/Utils/Exception.hh
index 42e1326fb..cc23ae350 100644
--- a/Utils/Exception.hh
+++ b/Utils/Exception.hh
@@ -261,7 +261,7 @@ namespace senf {
         the exception description:
         \code
         // Standard usage: Take \c errno from environment
-        SENF_THROW_SYSTEM_EXCEPTION()
+        SENF_THROW_SYSTEM_EXCEPTION("::open()")
             << " while opening configuration file: " << filename;
 
         // You may however explicitly specify the errno value
diff --git a/Utils/Logger/FileTarget.cc b/Utils/Logger/FileTarget.cc
index 568cc9d6b..4cc69ad4f 100644
--- a/Utils/Logger/FileTarget.cc
+++ b/Utils/Logger/FileTarget.cc
@@ -28,6 +28,8 @@
 
 // Custom includes
 #include "../Console/Console.hh"
+#include "../Exception.hh"
+#include <boost/filesystem/path.hpp>
 
 //#include "FileTarget.mpp"
 #define prefix_
@@ -35,21 +37,23 @@
 
 namespace {
     
-    std::string quoteFilename(std::string filename)
+    std::string getNodename(std::string const & filename, std::string const & nodename)
     {
-        for (std::string::iterator i (filename.begin()); i != filename.end(); ++i)
-            if (! senf::console::CommandParser::isWordChar(*i))
-                *i = '_';
-        return filename;
+        if (! nodename.empty())
+            return nodename;
+        return boost::filesystem::path(filename).leaf();
     }
 
 }
 
-prefix_ senf::log::FileTarget::FileTarget(std::string const & file)
-    : ofstream_t(file.c_str(), std::ofstream::app), 
-      IOStreamTarget(quoteFilename(file), ofstream_t::member), 
-      file_(file)
+prefix_ senf::log::FileTarget::FileTarget(std::string const & filename,
+                                          std::string const & nodename)
+    : ofstream_t (filename.c_str(), std::ofstream::app), 
+      IOStreamTarget (getNodename(filename, nodename), ofstream_t::member), 
+      file_ (filename)
 {
+    if (! ofstream_t::member)
+        SENF_THROW_SYSTEM_EXCEPTION("logfile open") << ": " << filename;
     consoleDir().add( "reopen", senf::membind(
                           static_cast<void (FileTarget::*)()>(&FileTarget::reopen),
                           this))
@@ -59,6 +63,8 @@ prefix_ senf::log::FileTarget::FileTarget(std::string const & file)
                          this))
         .arg("filename","new filename")
         .overloadDoc("Reopen logfile under new name");
+    consoleDir().add("file", boost::cref(file_))
+        .doc("Show filename log messages are sent to");
 }
 
 prefix_ void senf::log::FileTarget::reopen()
@@ -79,17 +85,21 @@ prefix_ void senf::log::FileTarget::reopen(std::string const & file)
 
 prefix_ senf::log::FileTarget::RegisterConsole::RegisterConsole()
 {
+    namespace kw = senf::console::kw;
+
     detail::TargetRegistry::instance().consoleDir().add("file-target",&RegisterConsole::create)
         .arg("filename", "name of logfile")
+        .arg("nodename", "name of node in console. Defaults to the files basename",
+             kw::default_value = "")
         .doc("Create new file target. Examples:\n"
              "\n"
              "Create new file target '/var/log/example.log\n"
              "    $ file-target \"/var/log/example.log\"\n"
-             "    <Directory '/sys/log/_var_log_example.log'>\n"
+             "    <Directory '/sys/log/example.log'>\n"
              "\n"
              "In a configuration file, create new file target '/var/log/example.log' and set\n"
              "some parameters (If written on one line, this works at the console too:\n"
-             "    /sys/log/file-target \"/var/log/example.log\" {\n"
+             "    /sys/log/file-target \"/var/log/example.log\" mainlog {\n"
              "        route (IMPORTANT);             # route all important messages\n"
              "        timeFormat \"\";               # use non-formatted time format\n"
              "        showArea false;                # don't show log area\n"
@@ -97,9 +107,10 @@ prefix_ senf::log::FileTarget::RegisterConsole::RegisterConsole()
 }
 
 prefix_ boost::shared_ptr<senf::console::DirectoryNode>
-senf::log::FileTarget::RegisterConsole::create(std::string const & filename)
+senf::log::FileTarget::RegisterConsole::create(std::string const & filename, 
+                                               std::string const & nodename)
 {
-    std::auto_ptr<Target> tp (new FileTarget(filename));
+    std::auto_ptr<Target> tp (new FileTarget(filename, nodename));
     Target & target (*tp.get());
     detail::TargetRegistry::instance().dynamicTarget(tp);
     return target.consoleDir().node().thisptr();
diff --git a/Utils/Logger/FileTarget.hh b/Utils/Logger/FileTarget.hh
index 11543d741..5f3082e64 100644
--- a/Utils/Logger/FileTarget.hh
+++ b/Utils/Logger/FileTarget.hh
@@ -69,7 +69,7 @@ namespace log {
         ///\name Structors and default members
         ///@{
 
-        explicit FileTarget(std::string const & filename); 
+        explicit FileTarget(std::string const & filename, std::string const & nodename = ""); 
                                         ///< Construct FileTarget writing to \a file
 
         ///@}
@@ -84,7 +84,7 @@ namespace log {
         struct RegisterConsole {
             RegisterConsole();
             static boost::shared_ptr<senf::console::DirectoryNode> create(
-                std::string const & filename);
+                std::string const & filename, std::string const & nodename);
             static RegisterConsole instance;
         };
     };
diff --git a/Utils/Logger/Target.cc b/Utils/Logger/Target.cc
index 7896bf078..9c883dc97 100644
--- a/Utils/Logger/Target.cc
+++ b/Utils/Logger/Target.cc
@@ -313,7 +313,7 @@ namespace {
     std::string formatLabel(std::string const & l)
     {
         if (l.empty())
-            return "-";
+            return "*";
         if (l.size() > 29)
             return l.substr(l.size()-29);
         return l;
@@ -323,7 +323,7 @@ namespace {
 prefix_ void senf::log::Target::consoleList(std::ostream & os)
 {
     static char const * levels[] = { 
-        "none", "verbose", "notice", "message", "important", "critical", "fatal", "disabled" };
+        "verbose", "verbose", "notice", "message", "important", "critical", "fatal", "disabled" };
 
     boost::format fmt ("%2d %-29s %-29s %-9s %-6s\n");
     os << fmt % "#" % "STREAM" % "AREA" % "LEVEL" % "ACTION";
-- 
GitLab