diff options
author | Rajith Muditha Attapattu <rajith@apache.org> | 2011-05-27 15:44:23 +0000 |
---|---|---|
committer | Rajith Muditha Attapattu <rajith@apache.org> | 2011-05-27 15:44:23 +0000 |
commit | 66765100f4257159622cefe57bed50125a5ad017 (patch) | |
tree | a88ee23bb194eb91f0ebb2d9b23ff423e3ea8e37 /cpp/src/qpid/log | |
parent | 1aeaa7b16e5ce54f10c901d75c4d40f9f88b9db6 (diff) | |
parent | 88b98b2f4152ef59a671fad55a0d08338b6b78ca (diff) | |
download | qpid-python-rajith_jms_client.tar.gz |
Creating a branch for experimenting with some ideas for JMS client.rajith_jms_client
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/rajith_jms_client@1128369 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/log')
-rw-r--r-- | cpp/src/qpid/log/Helpers.h | 79 | ||||
-rw-r--r-- | cpp/src/qpid/log/Logger.cpp | 167 | ||||
-rw-r--r-- | cpp/src/qpid/log/Options.cpp | 111 | ||||
-rw-r--r-- | cpp/src/qpid/log/OstreamOutput.cpp | 41 | ||||
-rw-r--r-- | cpp/src/qpid/log/OstreamOutput.h | 41 | ||||
-rw-r--r-- | cpp/src/qpid/log/Selector.cpp | 68 | ||||
-rw-r--r-- | cpp/src/qpid/log/Statement.cpp | 83 | ||||
-rw-r--r-- | cpp/src/qpid/log/posix/SinkOptions.cpp | 215 | ||||
-rw-r--r-- | cpp/src/qpid/log/posix/SinkOptions.h | 64 | ||||
-rw-r--r-- | cpp/src/qpid/log/windows/SinkOptions.cpp | 148 | ||||
-rw-r--r-- | cpp/src/qpid/log/windows/SinkOptions.h | 54 |
11 files changed, 0 insertions, 1071 deletions
diff --git a/cpp/src/qpid/log/Helpers.h b/cpp/src/qpid/log/Helpers.h deleted file mode 100644 index 82ef8244be..0000000000 --- a/cpp/src/qpid/log/Helpers.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef QPID_LOG_HELPERS_H -#define QPID_LOG_HELPERS_H - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - * - */ - -#include <boost/range.hpp> - -#include <ostream> - -namespace qpid { -namespace log { - -/** @file Helper classes for logging complex types */ - -/// @internal -template <class Range> -struct ListFormatter { - typedef typename boost::range_const_iterator<Range>::type Iterator; - boost::iterator_range<Iterator> range; - const char* separator; - - ListFormatter(const Range& r, const char* s=", ") : range(r), separator(s) {} -}; - -/// @internal -template <class Range> -std::ostream& operator<<(std::ostream& out, const ListFormatter<Range>& sl) { - typename ListFormatter<Range>::Iterator i = sl.range.begin(); - if (i != sl.range.end()) out << *(i++); - while (i != sl.range.end()) out << sl.separator << *(i++); - return out; -} - -/** Return a formatting object with operator << - * to stream range as a separated list. - *@param range: a range - all standard containers are ranges, - * as is a pair of iterators. - *@param separator: printed between elements, default ", " - */ -template <class Range> -ListFormatter<Range> formatList(const Range& range, const char* separator=", ") { - return ListFormatter<Range>(range, separator); -} - -/** Return a formatting object with operator << - * to stream the range defined by iterators [begin, end) - * as a separated list. - *@param begin, end: Beginning and end of range. - *@param separator: printed between elements, default ", " - */ -template <class U, class V> -ListFormatter<std::pair<U,V> > formatList(U begin, V end, const char* separator=", ") { - return formatList(std::make_pair(begin,end), separator); -} - - -}} // namespace qpid::log - - - -#endif /*!QPID_LOG_HELPERS_H*/ diff --git a/cpp/src/qpid/log/Logger.cpp b/cpp/src/qpid/log/Logger.cpp deleted file mode 100644 index 1600822142..0000000000 --- a/cpp/src/qpid/log/Logger.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* - * - * Copyright (c) 2006 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "qpid/log/Logger.h" -#include "qpid/log/Options.h" -#include "qpid/log/SinkOptions.h" -#include "qpid/memory.h" -#include "qpid/sys/Thread.h" -#include "qpid/sys/Time.h" -#include "qpid/DisableExceptionLogging.h" -#include <boost/pool/detail/singleton.hpp> -#include <boost/bind.hpp> -#include <boost/function.hpp> -#include <algorithm> -#include <sstream> -#include <iomanip> -#include <stdexcept> -#include <time.h> - - -namespace qpid { -namespace log { - -using namespace std; - -typedef sys::Mutex::ScopedLock ScopedLock; - -inline void Logger::enable_unlocked(Statement* s) { - s->enabled=selector.isEnabled(s->level, s->function); -} - -Logger& Logger::instance() { - return boost::details::pool::singleton_default<Logger>::instance(); -} - -Logger::Logger() : flags(0) { - // Disable automatic logging in Exception constructors to avoid - // re-entrant use of logger singleton if there is an error in - // option parsing. - DisableExceptionLogging del; - - // 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(""); - opts.parse(0, 0); - configure(opts); -} - -Logger::~Logger() {} - -void Logger::select(const Selector& s) { - ScopedLock l(lock); - selector=s; - std::for_each(statements.begin(), statements.end(), - boost::bind(&Logger::enable_unlocked, this, _1)); -} - -Logger::Output::Output() {} -Logger::Output::~Output() {} - -void Logger::log(const Statement& s, const std::string& msg) { - // Format the message outside the lock. - std::ostringstream os; - if (!prefix.empty()) - os << prefix << ": "; - if (flags&TIME) { - if (flags&HIRES) - qpid::sys::outputHiresNow(os); - else - qpid::sys::outputFormattedNow(os); - } - if (flags&LEVEL) - os << LevelTraits::name(s.level) << " "; - if (flags&THREAD) - os << "[0x" << hex << qpid::sys::Thread::logId() << "] "; - if (flags&FILE) - os << s.file << ":"; - if (flags&LINE) - os << dec << s.line << ":"; - if (flags&FUNCTION) - os << s.function << ":"; - if (flags & (FILE|LINE|FUNCTION)) - os << " "; - os << msg << endl; - std::string formatted=os.str(); - { - ScopedLock l(lock); - std::for_each(outputs.begin(), outputs.end(), - boost::bind(&Output::log, _1, s, formatted)); - } -} - -void Logger::output(std::auto_ptr<Output> out) { - ScopedLock l(lock); - outputs.push_back(out.release()); -} - -void Logger::clear() { - select(Selector()); // locked - format(0); // locked - ScopedLock l(lock); - outputs.clear(); -} - -void Logger::format(int formatFlags) { - ScopedLock l(lock); - flags=formatFlags; -} - -static int bitIf(bool test, int bit) { - return test ? bit : 0; -} - -int Logger::format(const Options& opts) { - int flags= - bitIf(opts.level, LEVEL) | - bitIf(opts.time, TIME) | - bitIf(opts.source, (FILE|LINE)) | - bitIf(opts.function, FUNCTION) | - bitIf(opts.thread, THREAD) | - bitIf(opts.hiresTs, HIRES); - format(flags); - return flags; -} - -void Logger::add(Statement& s) { - ScopedLock l(lock); - enable_unlocked(&s); - statements.insert(&s); -} - -void Logger::configure(const Options& opts) { - options = opts; - clear(); - Options o(opts); - if (o.trace) - o.selectors.push_back("trace+"); - format(o); - select(Selector(o)); - setPrefix(opts.prefix); - options.sinkOptions->setup(this); -} - -void Logger::reconfigure(const std::vector<std::string>& selectors) { - options.selectors = selectors; - select(Selector(options)); -} - -void Logger::setPrefix(const std::string& p) { prefix = p; } - -}} // namespace qpid::log diff --git a/cpp/src/qpid/log/Options.cpp b/cpp/src/qpid/log/Options.cpp deleted file mode 100644 index 0001d00bdf..0000000000 --- a/cpp/src/qpid/log/Options.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * - * Copyright (c) 2006 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "qpid/log/Options.h" -#include "qpid/log/SinkOptions.h" -#include "qpid/log/Statement.h" -#include "qpid/Options.h" -#include <map> -#include <string> -#include <algorithm> - -namespace qpid { -namespace log { - -using namespace std; - -Options::Options(const std::string& argv0_, const std::string& name_) : - qpid::Options(name_), - argv0(argv0_), - name(name_), - time(true), - level(true), - thread(false), - source(false), - function(false), - hiresTs(false), - trace(false), - sinkOptions (SinkOptions::create(argv0_)) -{ - selectors.push_back("notice+"); - - ostringstream levels; - levels << LevelTraits::name(Level(0)); - for (int i = 1; i < LevelTraits::COUNT; ++i) - levels << " " << LevelTraits::name(Level(i)); - - addOptions() - ("trace,t", optValue(trace), "Enables all logging" ) - ("log-enable", optValue(selectors, "RULE"), - ("Enables logging for selected levels and components. " - "RULE is in the form 'LEVEL[+][:PATTERN]' " - "Levels are one of: \n\t "+levels.str()+"\n" - "For example:\n" - "\t'--log-enable warning+' " - "logs all warning, error and critical messages.\n" - "\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-hires-timestamp", optValue(hiresTs,"yes|no"), "Use unformatted hi-res timestamp in log messages") - ("log-prefix", optValue(prefix,"STRING"), "Prefix to append to all log messages") - ; - add(*sinkOptions); -} - -Options::Options(const Options &o) : - qpid::Options(o.name), - argv0(o.argv0), - name(o.name), - selectors(o.selectors), - time(o.time), - level(o.level), - thread(o.thread), - source(o.source), - function(o.function), - hiresTs(o.hiresTs), - trace(o.trace), - prefix(o.prefix), - sinkOptions (SinkOptions::create(o.argv0)) -{ - *sinkOptions = *o.sinkOptions; -} - -Options& Options::operator=(const Options& x) { - if (this != &x) { - argv0 = x.argv0; - name = x.name; - selectors = x.selectors; - time = x.time; - level= x.level; - thread = x.thread; - source = x.source; - function = x.function; - hiresTs = x.hiresTs; - trace = x.trace; - prefix = x.prefix; - *sinkOptions = *x.sinkOptions; - } - return *this; -} - -}} // namespace qpid::log diff --git a/cpp/src/qpid/log/OstreamOutput.cpp b/cpp/src/qpid/log/OstreamOutput.cpp deleted file mode 100644 index 9b6ec1f8aa..0000000000 --- a/cpp/src/qpid/log/OstreamOutput.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * Copyright (c) 2006 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "qpid/log/OstreamOutput.h" -#include <stdexcept> - -using namespace std; - -namespace qpid { -namespace log { - -OstreamOutput::OstreamOutput(std::ostream& o) : out(&o) {} - -OstreamOutput::OstreamOutput(const std::string& file) - : out(new ofstream(file.c_str(), ios_base::out | ios_base::app)), - mine(out) -{ - if (!out->good()) - throw std::runtime_error("Can't open log file: "+file); -} - -void OstreamOutput::log(const Statement&, const std::string& m) { - *out << m << flush; -} - -}} // namespace qpid::log diff --git a/cpp/src/qpid/log/OstreamOutput.h b/cpp/src/qpid/log/OstreamOutput.h deleted file mode 100644 index 12fd4ce425..0000000000 --- a/cpp/src/qpid/log/OstreamOutput.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef QPID_LOG_OSTREAMOUTPUT_H -#define QPID_LOG_OSTREAMOUTPUT_H - -/* - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "qpid/log/Logger.h" -#include <boost/scoped_ptr.hpp> -#include <fstream> -#include <ostream> - -namespace qpid { -namespace log { - -/** - * OstreamOutput is a reusable logging sink that directs logging to a C++ - * ostream. - */ -class OstreamOutput : public qpid::log::Logger::Output { -public: - QPID_COMMON_EXTERN OstreamOutput(std::ostream& o); - QPID_COMMON_EXTERN OstreamOutput(const std::string& file); - - virtual void log(const Statement&, const std::string& m); - -private: - std::ostream* out; - boost::scoped_ptr<std::ostream> mine; -}; - -}} // namespace qpid::log - -#endif /*!QPID_LOG_OSTREAMOUTPUT_H*/ diff --git a/cpp/src/qpid/log/Selector.cpp b/cpp/src/qpid/log/Selector.cpp deleted file mode 100644 index a4bc580470..0000000000 --- a/cpp/src/qpid/log/Selector.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * - * Copyright (c) 2006 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "qpid/log/Selector.h" -#include "qpid/log/Options.h" -#include <boost/bind.hpp> -#include <algorithm> -#include <string.h> - -namespace qpid { -namespace log { - -using namespace std; - -void Selector::enable(const string& enableStr) { - string level, pattern; - size_t c=enableStr.find(':'); - if (c==string::npos) { - level=enableStr; - } - else { - level=enableStr.substr(0,c); - pattern=enableStr.substr(c+1); - } - if (!level.empty() && level[level.size()-1]=='+') { - for (int i = LevelTraits::level(level.substr(0,level.size()-1)); - i < LevelTraits::COUNT; - ++i) - enable(Level(i), pattern); - } - else { - enable(LevelTraits::level(level), pattern); - } -} - -Selector::Selector(const Options& opt){ - for_each(opt.selectors.begin(), opt.selectors.end(), - boost::bind(&Selector::enable, this, _1)); -} - -bool Selector::isEnabled(Level level, const char* function) { - const char* functionEnd = function+::strlen(function); - for (std::vector<std::string>::iterator i=substrings[level].begin(); - i != substrings[level].end(); - ++i) - { - if (std::search(function, functionEnd, i->begin(), i->end()) != functionEnd) - return true; - } - return false; -} - -}} // namespace qpid::log diff --git a/cpp/src/qpid/log/Statement.cpp b/cpp/src/qpid/log/Statement.cpp deleted file mode 100644 index 6a32b50096..0000000000 --- a/cpp/src/qpid/log/Statement.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - * - * Copyright (c) 2006 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "qpid/log/Statement.h" -#include "qpid/log/Logger.h" -#include <boost/bind.hpp> -#include <stdexcept> -#include <algorithm> -#include <ctype.h> - -namespace qpid { -namespace log { - -namespace { -using namespace std; - -struct NonPrint { bool operator()(unsigned char c) { return !isprint(c) && !isspace(c); } }; - -const char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - -std::string quote(const std::string& str) { - NonPrint nonPrint; - size_t n = std::count_if(str.begin(), str.end(), nonPrint); - if (n==0) return str; - std::string ret; - ret.reserve(str.size()+2*n); // Avoid extra allocations. - for (string::const_iterator i = str.begin(); i != str.end(); ++i) { - if (nonPrint(*i)) { - ret.push_back('\\'); - ret.push_back('x'); - ret.push_back(hex[((*i) >> 4)&0xf]); - ret.push_back(hex[(*i) & 0xf]); - } - else ret.push_back(*i); - } - return ret; -} - -} - -void Statement::log(const std::string& message) { - Logger::instance().log(*this, quote(message)); -} - -Statement::Initializer::Initializer(Statement& s) : statement(s) { - Logger::instance().add(s); -} - -namespace { -const char* names[LevelTraits::COUNT] = { - "trace", "debug", "info", "notice", "warning", "error", "critical" -}; - -} // namespace - -Level LevelTraits::level(const char* name) { - for (int i =0; i < LevelTraits::COUNT; ++i) { - if (strcmp(names[i], name)==0) - return Level(i); - } - throw std::runtime_error(std::string("Invalid log level name: ")+name); -} - -const char* LevelTraits::name(Level l) { - return names[l]; -} - -}} // namespace qpid::log diff --git a/cpp/src/qpid/log/posix/SinkOptions.cpp b/cpp/src/qpid/log/posix/SinkOptions.cpp deleted file mode 100644 index 292e9147f6..0000000000 --- a/cpp/src/qpid/log/posix/SinkOptions.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/* - * - * Copyright (c) 2006 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "qpid/log/posix/SinkOptions.h" -#include "qpid/log/SinkOptions.h" -#include "qpid/log/Logger.h" -#include "qpid/log/OstreamOutput.h" -#include "qpid/memory.h" -#include "qpid/Exception.h" -#include <iostream> -#include <map> -#include <string> -#include <syslog.h> - -using std::string; -using qpid::Exception; - -namespace { - -// SyslogFacilities maps from syslog values to the text equivalents. -class SyslogFacilities { -public: - typedef std::map<string, int> ByName; - typedef std::map<int, string> ByValue; - - SyslogFacilities() { - struct NameValue { const char* name; int value; }; - NameValue nameValue[] = { - { "AUTH", LOG_AUTH }, -#ifdef HAVE_LOG_AUTHPRIV - { "AUTHPRIV", LOG_AUTHPRIV }, -#endif - { "CRON", LOG_CRON }, - { "DAEMON", LOG_DAEMON }, -#ifdef HAVE_LOG_FTP - { "FTP", LOG_FTP }, -#endif - { "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); - std::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; -}; - -// 'priorities' maps qpid log levels to syslog priorities. They are in -// order of qpid log levels and must map to: -// "trace", "debug", "info", "notice", "warning", "error", "critical" -static int priorities[qpid::log::LevelTraits::COUNT] = { - LOG_DEBUG, LOG_DEBUG, LOG_INFO, LOG_NOTICE, - LOG_WARNING, LOG_ERR, LOG_CRIT -}; - -std::string basename(const std::string path) { - size_t i = path.find_last_of('/'); - return path.substr((i == std::string::npos) ? 0 : i+1); -} - -} // namespace - -namespace qpid { -namespace log { -namespace posix { - -std::ostream& operator<<(std::ostream& o, const SyslogFacility& f) { - return o << SyslogFacilities().name(f.value); -} - -std::istream& operator>>(std::istream& i, SyslogFacility& f) { - std::string name; - i >> name; - f.value = SyslogFacilities().value(name); - return i; -} - -class SyslogOutput : public qpid::log::Logger::Output { -public: - SyslogOutput(const std::string& logName, const SyslogFacility& logFacility) - : name(logName), facility(logFacility.value) - { - ::openlog(name.c_str(), LOG_PID, facility); - } - - virtual ~SyslogOutput() { - ::closelog(); - } - - virtual void log(const Statement& s, const std::string& m) - { - syslog(priorities[s.level], "%s", m.c_str()); - } - -private: - std::string name; - int facility; -}; - -SinkOptions::SinkOptions(const std::string& argv0) - : qpid::log::SinkOptions(), - logToStderr(true), - logToStdout(false), - logToSyslog(false), - syslogName(basename(argv0)), - syslogFacility(LOG_DAEMON) { - - addOptions() - ("log-to-stderr", optValue(logToStderr, "yes|no"), "Send logging output to stderr") - ("log-to-stdout", optValue(logToStdout, "yes|no"), "Send logging output to stdout") - ("log-to-file", optValue(logFile, "FILE"), "Send log output to FILE.") - ("log-to-syslog", optValue(logToSyslog, "yes|no"), "Send logging output to syslog;\n\tcustomize using --syslog-name and --syslog-facility") - ("syslog-name", optValue(syslogName, "NAME"), "Name to use in syslog messages") - ("syslog-facility", optValue(syslogFacility,"LOG_XXX"), "Facility to use in syslog messages") - ; - -} - -qpid::log::SinkOptions& SinkOptions::operator=(const qpid::log::SinkOptions& rhs) { - const SinkOptions *prhs = dynamic_cast<const SinkOptions*>(&rhs); - if (this != prhs) { - logToStderr = prhs->logToStderr; - logToStdout = prhs->logToStdout; - logToSyslog = prhs->logToSyslog; - logFile = prhs->logFile; - syslogName = prhs->syslogName; - syslogFacility.value = prhs->syslogFacility.value; - } - return *this; -} - -void SinkOptions::detached(void) { - if (logToStderr && !logToStdout && !logToSyslog) { - logToStderr = false; - logToSyslog = true; - } -} - -// The Logger acting on these options calls setup() to request any -// Sinks be set up and fed back to the logger. -void SinkOptions::setup(qpid::log::Logger *logger) { - if (logToStderr) - logger->output(make_auto_ptr<qpid::log::Logger::Output> - (new qpid::log::OstreamOutput(std::clog))); - if (logToStdout) - logger->output(make_auto_ptr<qpid::log::Logger::Output> - (new qpid::log::OstreamOutput(std::cout))); - - if (logFile.length() > 0) - logger->output(make_auto_ptr<qpid::log::Logger::Output> - (new qpid::log::OstreamOutput(logFile))); - - if (logToSyslog) - logger->output(make_auto_ptr<qpid::log::Logger::Output> - (new SyslogOutput(syslogName, syslogFacility))); - -} - -} // namespace qpid::log::posix - -SinkOptions* SinkOptions::create(const std::string& argv0) { - return new qpid::log::posix::SinkOptions (argv0); -} - -}} // namespace qpid::log diff --git a/cpp/src/qpid/log/posix/SinkOptions.h b/cpp/src/qpid/log/posix/SinkOptions.h deleted file mode 100644 index d929c29025..0000000000 --- a/cpp/src/qpid/log/posix/SinkOptions.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef QPID_LOG_POSIX_SINKOPTIONS_H -#define QPID_LOG_POSIX_SINKOPTIONS_H - -/* - * - * Copyright (c) 2006 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "qpid/log/SinkOptions.h" -#include <string> - -namespace qpid { -namespace log { -namespace posix { - -/** - * Provides a type that can be passed to << and >> operators to convert - * syslog facility values to/from strings. - */ -struct SyslogFacility { - int value; - SyslogFacility(int i=0) : value(i) {} -}; - -struct SinkOptions : public qpid::log::SinkOptions { - SinkOptions(const std::string& argv0); - virtual ~SinkOptions() {} - - virtual qpid::log::SinkOptions& operator=(const qpid::log::SinkOptions& rhs); - - // This allows the caller to indicate that there's no normal outputs - // available. For example, when running as a daemon. In these cases, the - // platform's "syslog"-type output should replace the default stderr - // unless some other sink has been selected. - virtual void detached(void); - - // The Logger acting on these options calls setup() to request any - // Sinks be set up and fed back to the logger. - virtual void setup(qpid::log::Logger *logger); - - bool logToStderr; - bool logToStdout; - bool logToSyslog; - std::string logFile; - std::string syslogName; - SyslogFacility syslogFacility; -}; - -}}} // namespace qpid::log::posix - -#endif /*!QPID_LOG_POSIX_SINKOPTIONS_H*/ diff --git a/cpp/src/qpid/log/windows/SinkOptions.cpp b/cpp/src/qpid/log/windows/SinkOptions.cpp deleted file mode 100644 index 0c74bea64e..0000000000 --- a/cpp/src/qpid/log/windows/SinkOptions.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - * - * Copyright (c) 2006 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "qpid/log/windows/SinkOptions.h" -#include "qpid/log/SinkOptions.h" -#include "qpid/log/Logger.h" -#include "qpid/log/OstreamOutput.h" -#include "qpid/memory.h" -#include "qpid/Exception.h" -#include <iostream> -#include <map> -#include <string> - -#include <windows.h> - -using qpid::Exception; - -namespace qpid { -namespace log { -namespace windows { - -namespace { - -// 'eventTypes' maps qpid log levels to Windows event types. They are in -// order of qpid log levels and must map to: -// "trace", "debug", "info", "notice", "warning", "error", "critical" -static int eventTypes[qpid::log::LevelTraits::COUNT] = { - EVENTLOG_INFORMATION_TYPE, /* trace */ - EVENTLOG_INFORMATION_TYPE, /* debug */ - EVENTLOG_INFORMATION_TYPE, /* info */ - EVENTLOG_INFORMATION_TYPE, /* notice */ - EVENTLOG_WARNING_TYPE, /* warning */ - EVENTLOG_ERROR_TYPE, /* error */ - EVENTLOG_ERROR_TYPE /* critical */ -}; - -} // namespace - -class EventLogOutput : public qpid::log::Logger::Output { -public: - EventLogOutput(const std::string& /*sourceName*/) : logHandle(0) - { - logHandle = OpenEventLog(0, "Application"); - } - - virtual ~EventLogOutput() { - if (logHandle) - CloseEventLog(logHandle); - } - - virtual void log(const Statement& s, const std::string& m) - { - if (logHandle) { - const char *msg = m.c_str(); - ReportEvent(logHandle, - eventTypes[s.level], - 0, /* category unused */ - 0, /* event id */ - 0, /* user security id */ - 1, /* number of strings */ - 0, /* no event-specific data */ - &msg, - 0); - } - } - -private: - HANDLE logHandle; -}; - -SinkOptions::SinkOptions(const std::string& /*argv0*/) - : qpid::log::SinkOptions(), - logToStderr(true), - logToStdout(false), - logToEventLog(false), - eventSource("Application") -{ - addOptions() - ("log-to-stderr", optValue(logToStderr, "yes|no"), "Send logging output to stderr") - ("log-to-stdout", optValue(logToStdout, "yes|no"), "Send logging output to stdout") - ("log-to-file", optValue(logFile, "FILE"), "Send log output to FILE.") - ("log-to-eventlog", optValue(logToEventLog, "yes|no"), "Send logging output to event log;\n\tcustomize using --syslog-name and --syslog-facility") - ("eventlog-source-name", optValue(eventSource, "Application"), "Event source to log to") - ; - -} - -qpid::log::SinkOptions& SinkOptions::operator=(const qpid::log::SinkOptions& rhs) { - const SinkOptions *prhs = dynamic_cast<const SinkOptions*>(&rhs); - if (this != prhs) { - logToStderr = prhs->logToStderr; - logToStdout = prhs->logToStdout; - logToEventLog = prhs->logToEventLog; - eventSource = prhs->eventSource; - logFile = prhs->logFile; - } - return *this; -} - -void SinkOptions::detached(void) { - if (logToStderr && !logToStdout && !logToEventLog) { - logToStderr = false; - logToEventLog = true; - } -} - -// The Logger acting on these options calls setup() to request any -// Sinks be set up and fed back to the logger. -void SinkOptions::setup(qpid::log::Logger *logger) { - if (logToStderr) - logger->output(make_auto_ptr<qpid::log::Logger::Output> - (new qpid::log::OstreamOutput(std::clog))); - if (logToStdout) - logger->output(make_auto_ptr<qpid::log::Logger::Output> - (new qpid::log::OstreamOutput(std::cout))); - - if (logFile.length() > 0) - logger->output(make_auto_ptr<qpid::log::Logger::Output> - (new qpid::log::OstreamOutput(logFile))); - - if (logToEventLog) - logger->output(make_auto_ptr<qpid::log::Logger::Output> - (new EventLogOutput(eventSource))); - -} - -} // namespace windows - -SinkOptions* SinkOptions::create(const std::string& argv0) { - return new qpid::log::windows::SinkOptions (argv0); -} - -}} // namespace qpid::log diff --git a/cpp/src/qpid/log/windows/SinkOptions.h b/cpp/src/qpid/log/windows/SinkOptions.h deleted file mode 100644 index f270c504a2..0000000000 --- a/cpp/src/qpid/log/windows/SinkOptions.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef QPID_LOG_WINDOWS_SINKOPTIONS_H -#define QPID_LOG_WINDOWS_SINKOPTIONS_H - -/* - * - * Copyright (c) 2006 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "qpid/log/SinkOptions.h" -#include <string> - -namespace qpid { -namespace log { -namespace windows { - -struct QPID_COMMON_CLASS_EXTERN SinkOptions : public qpid::log::SinkOptions { - QPID_COMMON_EXTERN SinkOptions(const std::string& argv0); - virtual ~SinkOptions() {} - - QPID_COMMON_EXTERN virtual qpid::log::SinkOptions& operator=(const qpid::log::SinkOptions& rhs); - - // This allows the caller to indicate that there's no normal outputs - // available. For example, when running as a service. In these cases, the - // platform's "syslog"-type output should replace the default stderr - // unless some other sink has been selected. - QPID_COMMON_EXTERN virtual void detached(void); - - // The Logger acting on these options calls setup() to request any - // Sinks be set up and fed back to the logger. - QPID_COMMON_EXTERN virtual void setup(qpid::log::Logger *logger); - - bool logToStderr; - bool logToStdout; - bool logToEventLog; - std::string eventSource; - std::string logFile; -}; - -}}} // namespace qpid::log::windows - -#endif /*!QPID_LOG_WINDOWS_SINKOPTIONS_H*/ |