summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/log/Options.cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2008-06-02 20:52:40 +0000
committerAlan Conway <aconway@apache.org>2008-06-02 20:52:40 +0000
commit6c5f69a0e6e62fc220f3b4198dad1f202552e2ad (patch)
tree80b6a3ff24a6fe91adc36f3e83044ee44b00ac5a /cpp/src/qpid/log/Options.cpp
parent1322ce3cf402f3bb74c2a411dcbdfd3779ed6d3b (diff)
downloadqpid-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.cpp112
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