diff options
| author | Alan Conway <aconway@apache.org> | 2008-06-02 20:52:40 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2008-06-02 20:52:40 +0000 |
| commit | 6c5f69a0e6e62fc220f3b4198dad1f202552e2ad (patch) | |
| tree | 80b6a3ff24a6fe91adc36f3e83044ee44b00ac5a /cpp/src/qpid/log/Options.cpp | |
| parent | 1322ce3cf402f3bb74c2a411dcbdfd3779ed6d3b (diff) | |
| download | qpid-python-6c5f69a0e6e62fc220f3b4198dad1f202552e2ad.tar.gz | |
Added --syslog-name, --syslog-facility options.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@662558 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/log/Options.cpp')
| -rw-r--r-- | cpp/src/qpid/log/Options.cpp | 112 |
1 files changed, 98 insertions, 14 deletions
diff --git a/cpp/src/qpid/log/Options.cpp b/cpp/src/qpid/log/Options.cpp index dd296f3a93..0fb7fb4cbb 100644 --- a/cpp/src/qpid/log/Options.cpp +++ b/cpp/src/qpid/log/Options.cpp @@ -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 @@ Options::Options(const std::string& name) : qpid::Options(name), 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 @@ Options::Options(const std::string& name) : qpid::Options(name), "\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 |
