Utils/Logger: Change FileTarget default console node name to file basename
g0dil [Tue, 3 Mar 2009 08:45:44 +0000 (08:45 +0000)]
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

git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1138 270642c3-0616-0410-b53a-bc976706d245

Utils/Console/Executor.cc
Utils/Exception.hh
Utils/Logger/FileTarget.cc
Utils/Logger/FileTarget.hh
Utils/Logger/Target.cc

index e464906..1a93b6e 100644 (file)
@@ -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);
     }
 }
 
index 42e1326..cc23ae3 100644 (file)
@@ -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
index 568cc9d..4cc69ad 100644 (file)
@@ -28,6 +28,8 @@
 
 // Custom includes
 #include "../Console/Console.hh"
+#include "../Exception.hh"
+#include <boost/filesystem/path.hpp>
 
 //#include "FileTarget.mpp"
 #define prefix_
 
 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();
index 11543d7..5f3082e 100644 (file)
@@ -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;
         };
     };
index 7896bf0..9c883dc 100644 (file)
@@ -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";