Author: aconway
Date: Mon Jun  2 13:52:40 2008
New Revision: 662558

URL: http://svn.apache.org/viewvc?rev=662558&view=rev
Log:

Added --syslog-name, --syslog-facility options.

Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/log/Logger.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/log/Logger.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/log/Options.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/log/Options.h
    incubator/qpid/trunk/qpid/cpp/src/qpidd.cpp
    incubator/qpid/trunk/qpid/cpp/src/tests/TestOptions.h
    incubator/qpid/trunk/qpid/cpp/src/tests/logging.cpp

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.cpp?rev=662558&r1=662557&r2=662558&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/Connection.cpp Mon Jun  2 
13:52:40 2008
@@ -53,7 +53,8 @@
     const std::string& vhost,
     uint16_t maxFrameSize)
 {
-    ConnectionSettings settings;
+    // FIXME aconway 2008-06-02: refactor ConnectionSettings to separate out 
command line parsing.
+    ConnectionSettings settings(""); 
     settings.host = host;
     settings.port = port;
     settings.username = uid;

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.cpp?rev=662558&r1=662557&r2=662558&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.cpp 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.cpp Mon 
Jun  2 13:52:40 2008
@@ -29,7 +29,7 @@
 namespace qpid {
 namespace client {
 
-ConnectionSettings::ConnectionSettings() :
+ConnectionSettings::ConnectionSettings(const std::string& argv0) :
     Options("Connection Settings"),
     host("localhost"), 
     port(TcpAddress::DEFAULT_PORT),
@@ -42,7 +42,8 @@
     maxChannels(32767),
     maxFrameSize(65535),
     bounds(2),
-    tcpNoDelay(false)
+    tcpNoDelay(false),
+    log(argv0)
 {
     addOptions()
         ("broker,b", optValue(host, "HOST"), "Broker host to connect to") 
@@ -65,7 +66,7 @@
 void ConnectionSettings::parse(int argc, char** argv) 
 {
     qpid::Options::parse(argc, argv);
-    qpid::log::Logger::instance().configure(log, argv[0]);
+    qpid::log::Logger::instance().configure(log);
 }
 
 

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.h?rev=662558&r1=662557&r2=662558&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.h 
(original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.h Mon Jun  
2 13:52:40 2008
@@ -37,9 +37,9 @@
  * Used to hold seetings for a connection (and parse these from
  * command line options etc if desired).
  */
-struct ConnectionSettings : qpid::Options, qpid::sys::Socket::Configuration
-{
-    ConnectionSettings();
+struct ConnectionSettings : qpid::Options, qpid::sys::Socket::Configuration {
+    // FIXME aconway 2008-06-02: separate option parsing from settings as 
subclass.
+    ConnectionSettings(const std::string& argv0=std::string());
     virtual ~ConnectionSettings();
 
     /**

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/log/Logger.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/log/Logger.cpp?rev=662558&r1=662557&r2=662558&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/log/Logger.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/log/Logger.cpp Mon Jun  2 13:52:40 
2008
@@ -63,8 +63,8 @@
 };
 
 struct SyslogOutput : public Logger::Output {
-    SyslogOutput(const std::string& name, int facility_=LOG_USER)
-        : progName(name), facility(facility_)
+    SyslogOutput(const Options& opts)
+        : name(opts.syslogName), facility(opts.syslogFacility.value)
     {
         ::openlog(name.c_str(), LOG_PID, facility);
     }
@@ -78,7 +78,7 @@
         syslog(LevelTraits::priority(s.level), "%s", m.c_str());
     }
     
-    std::string progName;
+    std::string name;
     int facility;
 };
 
@@ -90,9 +90,9 @@
     // Initialize myself from env variables so all programs
     // (e.g. tests) can use logging even if they don't parse
     // command line args.
-    Options opts;
+    Options opts("");
     opts.parse(0, 0);           
-    configure(opts,"");
+    configure(opts);
 }
 
 Logger::~Logger() {}
@@ -161,17 +161,17 @@
     output(make_auto_ptr<Output>(new OstreamOutput(out)));
 }
 
-void Logger::syslog(const std::string& progName) {
-    output(make_auto_ptr<Output>(new SyslogOutput(progName)));
+void Logger::syslog(const Options& opts) {
+    output(make_auto_ptr<Output>(new SyslogOutput(opts)));
 }
 
-void Logger::output(const std::string& name) {
+void Logger::output(const std::string& name, const Options& opts) {
     if (name=="stderr")
         output(clog);
     else if (name=="stdout")
         output(cout);
     else if (name=="syslog")
-        syslog(syslogName);
+        syslog(opts);
     else 
         output(make_auto_ptr<Output>(new OstreamOutput(name)));
 }
@@ -209,21 +209,16 @@
     statements.insert(&s);
 }
 
-void Logger::configure(const Options& opts, const std::string& prog)
-{
+void Logger::configure(const Options& opts) {
     clear();
     Options o(opts);
     if (o.trace)
         o.selectors.push_back("trace+");
-    {
-        ScopedLock l(lock);
-        syslogName=prog;
-    }
     format(o); 
     select(Selector(o));
-    void (Logger::* outputFn)(const std::string&) = &Logger::output;
+    void (Logger::* outputFn)(const std::string&, const Options&) = 
&Logger::output;
     for_each(o.outputs.begin(), o.outputs.end(),
-             boost::bind(outputFn, this, _1));
+             boost::bind(outputFn, this, _1, boost::cref(o)));
 }
 
 }} // namespace qpid::log

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/log/Logger.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/log/Logger.h?rev=662558&r1=662557&r2=662558&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/log/Logger.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/log/Logger.h Mon Jun  2 13:52:40 2008
@@ -62,7 +62,7 @@
     int format(const Options&);
 
     /** Configure logger from Options */
-    void configure(const Options& o, const std::string& progname);
+    void configure(const Options& o);
 
     /** Add a statement. */
     void add(Statement& s);
@@ -79,13 +79,13 @@
     void output(std::ostream&);
 
     /** Add syslog to outputs. */
-    void syslog(const std::string& programName);
+    void syslog(const Options&);
 
     /** Add an output.
      [EMAIL PROTECTED] name a file name or one of the special tokens:
      *stdout, stderr, syslog.
      */
-    void output(const std::string& name);
+    void output(const std::string& name, const Options&);
 
     /** Add an output destination for messages */
     void output(std::auto_ptr<Output> out); 
@@ -100,7 +100,6 @@
     sys::Mutex lock;
     inline void enable_unlocked(Statement* s);
 
-    std::string syslogName;
     Statements statements;
     Outputs outputs;
     Selector selector;

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/log/Options.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/log/Options.cpp?rev=662558&r1=662557&r2=662558&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/log/Options.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/log/Options.cpp Mon Jun  2 13:52:40 
2008
@@ -19,14 +19,100 @@
 #include "Options.h"
 #include "Statement.h"
 #include "qpid/Options.h"
+#include <map>
+#include <string>
+#include <algorithm>
+#include <syslog.h>
 
 namespace qpid {
 namespace log {
 
 using namespace std;
 
-Options::Options(const std::string& name) : qpid::Options(name),
-                                            time(true), level(true), 
thread(false), source(false), function(false), trace(false)
+namespace {
+
+class SyslogFacilities {
+  public:
+    typedef map<string, int> ByName;
+    typedef map<int, string> ByValue;
+
+    SyslogFacilities() {
+        struct NameValue { const char* name; int value; };
+        NameValue nameValue[] = {
+            { "AUTH", LOG_AUTH },
+            { "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 }
+        };
+        for (size_t i = 0; i < sizeof(nameValue)/sizeof(nameValue[0]); ++i) {
+            byName.insert(ByName::value_type(nameValue[i].name, 
nameValue[i].value));
+            // Recognise with and without LOG_ prefix e.g.: AUTH and LOG_AUTH
+            byName.insert(ByName::value_type(string("LOG_")+nameValue[i].name, 
nameValue[i].value));
+            byValue.insert(ByValue::value_type(nameValue[i].value, 
string("LOG_")+nameValue[i].name));
+        }
+    };
+    
+    int value(const string& name) const {
+        string key(name);
+        transform(key.begin(), key.end(), key.begin(), ::toupper);        
+        ByName::const_iterator i = byName.find(key);
+        if (i == byName.end())
+            throw Exception("Not a valid syslog facility: " + name);
+        return i->second;
+    }
+
+    string name(int value) const {
+        ByValue::const_iterator i = byValue.find(value);
+        if (i == byValue.end())
+            throw Exception("Not a valid syslog value: " + value);
+        return i->second;
+    }
+
+  private:
+    ByName byName;
+    ByValue byValue;
+};
+
+}
+
+ostream& operator<<(ostream& o, const SyslogFacility& f) {
+    return o << SyslogFacilities().name(f.value);
+}
+
+istream& operator>>(istream& i, SyslogFacility& f) {
+    std::string name;
+    i >> name;
+    f.value = SyslogFacilities().value(name);
+    return i;
+}
+
+namespace {
+std::string basename(const std::string path) {
+    size_t i = path.find_last_of('/');
+    return path.substr((i == std::string::npos) ? 0 : i+1);
+}
+}
+
+Options::Options(const std::string& argv0, const std::string& name) :
+    qpid::Options(name),
+    time(true), level(true), thread(false), source(false), function(false), 
trace(false),
+    syslogName(basename(argv0)), syslogFacility(LOG_DAEMON)
 {
     outputs.push_back("stderr");
     selectors.push_back("error+");
@@ -35,9 +121,9 @@
     levels << LevelTraits::name(Level(0));
     for (int i = 1; i < LevelTraits::COUNT; ++i)
         levels << " " << LevelTraits::name(Level(i));
+    
     addOptions()
-        ("log-output", optValue(outputs, "FILE"),
-         "Send log output to FILE. "
+        ("log-output", optValue(outputs, "FILE"), "Send log output to FILE. "
          "FILE can be a file name or one of the special values:\n"
          "stderr, stdout, syslog")
         ("trace,t", optValue(trace), "Enables all logging" )
@@ -51,16 +137,14 @@
           "\t'--log-enable debug:framing' "
           "logs debug messages from the framing namespace. "
           "This option can be used multiple times").c_str())
-        ("log-time", optValue(time, "yes|no"),
-         "Include time in log messages")
-        ("log-level", optValue(level,"yes|no"),
-         "Include severity level in log messages")
-        ("log-source", optValue(source,"yes|no"),
-         "Include source file:line in log messages")
-        ("log-thread", optValue(thread,"yes|no"),
-         "Include thread ID in log messages")
-        ("log-function", optValue(function,"yes|no"),
-         "Include function signature in log messages");
+        ("log-time", optValue(time, "yes|no"), "Include time in log messages")
+        ("log-level", optValue(level,"yes|no"), "Include severity level in log 
messages")
+        ("log-source", optValue(source,"yes|no"), "Include source file:line in 
log messages")
+        ("log-thread", optValue(thread,"yes|no"), "Include thread ID in log 
messages")
+        ("log-function", optValue(function,"yes|no"), "Include function 
signature in log messages")
+        ("syslog-name", optValue(syslogName, "NAME"), "Name to use in syslog 
messages")
+        ("syslog-facility", optValue(syslogFacility,"LOG_XXX"), "Facility to 
use in syslog messages")
+        ;
 }        
         
 }} // namespace qpid::log

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/log/Options.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/log/Options.h?rev=662558&r1=662557&r2=662558&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/log/Options.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/log/Options.h Mon Jun  2 13:52:40 
2008
@@ -19,19 +19,32 @@
  *
  */
 #include "qpid/Options.h"
-
+#include <iosfwd>
 
 namespace qpid {
 namespace log {
 
+/** Provides << and >> operators to convert syslog facility values to/from 
strings. */
+struct SyslogFacility {
+    int value;
+    SyslogFacility(int i=0) : value(i) {}
+};
+
+std::ostream& operator<<(std::ostream&, const SyslogFacility&);
+std::istream& operator>>(std::istream&, SyslogFacility&);
+
 /** Logging options for config parser. */
 struct Options : public qpid::Options {
-    Options(const std::string& name="Logging options");
+    /** Pass argv[0] for use in syslog output */
+    Options(const std::string& argv0,
+            const std::string& name="Logging options");
 
     std::vector<std::string> selectors;
     std::vector<std::string> outputs;
     bool time, level, thread, source, function;
     bool trace;
+    std::string syslogName;
+    SyslogFacility syslogFacility;
 };
 
 

Modified: incubator/qpid/trunk/qpid/cpp/src/qpidd.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpidd.cpp?rev=662558&r1=662557&r2=662558&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpidd.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpidd.cpp Mon Jun  2 13:52:40 2008
@@ -79,7 +79,7 @@
     DaemonOptions daemon;
     qpid::log::Options log;
     
-    QpiddOptions() : qpid::Options("Options"), common("", "/etc/qpidd.conf") {
+    QpiddOptions(const char* argv0) : qpid::Options("Options"), common("", 
"/etc/qpidd.conf"), log(argv0) {
         add(common);
         add(module);
         add(broker);
@@ -109,7 +109,7 @@
     ModuleOptions module;
     qpid::log::Options log;
 
-    BootstrapOptions() : qpid::Options("Options"), common("", 
"/etc/qpidd.conf") {
+    BootstrapOptions(const char* argv0) : qpid::Options("Options"), common("", 
"/etc/qpidd.conf"), log(argv0) {
         add(common);
         add(module);
         add(log);
@@ -181,14 +181,13 @@
     try
     {
         {
-            BootstrapOptions bootOptions;
+            BootstrapOptions bootOptions(argv[0]);
             string           defaultPath (bootOptions.module.loadDir);
-
             // Parse only the common, load, and log options to see which 
modules need
             // to be loaded.  Once the modules are loaded, the command line 
will
             // be re-parsed with all of the module-supplied options.
             bootOptions.parse (argc, argv, bootOptions.common.config, true);
-            qpid::log::Logger::instance().configure(bootOptions.log, argv[0]);
+            qpid::log::Logger::instance().configure(bootOptions.log);
 
             for (vector<string>::iterator iter = 
bootOptions.module.load.begin();
                  iter != bootOptions.module.load.end();
@@ -202,7 +201,7 @@
         }
 
         // Parse options
-        options.reset(new QpiddOptions());
+        options.reset(new QpiddOptions(argv[0]));
         options->parse(argc, argv, options->common.config);
 
         // Options that just print information.

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/TestOptions.h
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/TestOptions.h?rev=662558&r1=662557&r2=662558&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/TestOptions.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/TestOptions.h Mon Jun  2 13:52:40 
2008
@@ -52,7 +52,7 @@
             msg << *this << std::endl << std::endl << e.what() << std::endl;
             throw qpid::Options::Exception(msg.str());
         }
-        qpid::log::Logger::instance().configure(con.log, argv[0]);
+        qpid::log::Logger::instance().configure(con.log);
         if (help) {
             std::ostringstream msg;
             msg << *this << std::endl << std::endl << helpText << std::endl;

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/logging.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/logging.cpp?rev=662558&r1=662557&r2=662558&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/logging.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/logging.cpp Mon Jun  2 13:52:40 2008
@@ -265,7 +265,7 @@
         "--log-thread", "true",
         "--log-function", "YES"
     };
-    qpid::log::Options opts;
+    qpid::log::Options opts("");
     opts.parse(ARGC(argv), const_cast<char**>(argv));
     vector<string> expect=list_of("error+:foo")("debug:bar")("info");
     BOOST_CHECK_EQUAL(expect, opts.selectors);
@@ -278,7 +278,7 @@
 }
 
 QPID_AUTO_TEST_CASE(testOptionsDefault) {
-    Options opts;
+    Options opts("");
     vector<string> expect=list_of("stderr");
     BOOST_CHECK_EQUAL(expect, opts.outputs);
     expect=list_of("error+");
@@ -294,7 +294,7 @@
         "--log-enable", "debug:bar",
         "--log-enable", "info"
     };
-    qpid::log::Options opts;
+    qpid::log::Options opts("");
     opts.parse(ARGC(argv), const_cast<char**>(argv));
     vector<string> expect=list_of("error+:foo")("debug:bar")("info");
     BOOST_CHECK_EQUAL(expect, opts.selectors);
@@ -309,7 +309,7 @@
 QPID_AUTO_TEST_CASE(testOptionsFormat) {
     Logger l;
     {
-        Options opts;
+        Options opts("");
         BOOST_CHECK_EQUAL(Logger::TIME|Logger::LEVEL, l.format(opts));
         const char* argv[]={
             0,
@@ -323,7 +323,7 @@
             Logger::FILE|Logger::LINE|Logger::THREAD, l.format(opts));
     }
     {
-        Options opts;           // Clear.
+        Options opts("");           // Clear.
         const char* argv[]={
             0,
             "--log-level", "no",
@@ -341,7 +341,7 @@
 QPID_AUTO_TEST_CASE(testLoggerConfigure) {
     Logger& l=Logger::instance();
     l.clear();
-    Options opts;
+    Options opts("test");
     const char* argv[]={
         0,
         "--log-time", "no", 
@@ -350,7 +350,7 @@
         "--log-enable", "critical"
     };
     opts.parse(ARGC(argv), const_cast<char**>(argv));
-    l.configure(opts, "test");
+    l.configure(opts);
     QPID_LOG(critical, "foo"); int srcline=__LINE__;
     ifstream log("logging.tmp");
     string line;
@@ -364,11 +364,11 @@
 QPID_AUTO_TEST_CASE(testQuoteNonPrintable) {
     Logger& l=Logger::instance();
     l.clear();
-    Options opts;
+    Options opts("test");
     opts.outputs.clear();
     opts.outputs.push_back("logging.tmp");
     opts.time=false;
-    l.configure(opts, "test");
+    l.configure(opts);
     char s[] = "null\0tab\tspace newline\nret\r\x80\x99\xff";
     string str(s, sizeof(s));
     QPID_LOG(critical, str); 


Reply via email to