diff options
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r-- | qpid/cpp/src/qpid/log/Logger.cpp | 7 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/log/Options.cpp | 18 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/log/Selector.cpp | 31 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/log/Statement.cpp | 59 | ||||
-rw-r--r-- | qpid/cpp/src/tests/logging.cpp | 2 |
5 files changed, 103 insertions, 14 deletions
diff --git a/qpid/cpp/src/qpid/log/Logger.cpp b/qpid/cpp/src/qpid/log/Logger.cpp index 800881c077..7c2e807ca9 100644 --- a/qpid/cpp/src/qpid/log/Logger.cpp +++ b/qpid/cpp/src/qpid/log/Logger.cpp @@ -47,7 +47,7 @@ using namespace std; typedef sys::Mutex::ScopedLock ScopedLock; inline void Logger::enable_unlocked(Statement* s) { - s->enabled=selector.isEnabled(s->level, s->function); + s->enabled=selector.isEnabled(s->level, s->function, s->category); } Logger& Logger::instance() { @@ -95,6 +95,8 @@ void Logger::log(const Statement& s, const std::string& msg) { else qpid::sys::outputFormattedNow(os); } + if (flags&CATEGORY) + os << "[" << CategoryTraits::name(s.category) << "] "; if (flags&LEVEL) os << LevelTraits::name(s.level) << " "; if (flags&THREAD) @@ -144,7 +146,8 @@ int Logger::format(const Options& opts) { bitIf(opts.source, (FILE|LINE)) | bitIf(opts.function, FUNCTION) | bitIf(opts.thread, THREAD) | - bitIf(opts.hiresTs, HIRES); + bitIf(opts.hiresTs, HIRES) | + bitIf(opts.category, CATEGORY); format(flags); return flags; } diff --git a/qpid/cpp/src/qpid/log/Options.cpp b/qpid/cpp/src/qpid/log/Options.cpp index 1259244297..10422bbb1e 100644 --- a/qpid/cpp/src/qpid/log/Options.cpp +++ b/qpid/cpp/src/qpid/log/Options.cpp @@ -39,6 +39,7 @@ Options::Options(const std::string& argv0_, const std::string& name_) : source(false), function(false), hiresTs(false), + category(true), trace(false), sinkOptions (SinkOptions::create(argv0_)) { @@ -49,15 +50,23 @@ Options::Options(const std::string& argv0_, const std::string& name_) : for (int i = 1; i < LevelTraits::COUNT; ++i) levels << " " << LevelTraits::name(Level(i)); + ostringstream categories; + categories << CategoryTraits::name(Category(0)); + for (int i = 1; i < CategoryTraits::COUNT; ++i) + categories << " " << CategoryTraits::name(Category(i)); + addOptions() ("trace,t", optValue(trace), "Enables all logging" ) ("log-enable", optValue(selectors, "RULE"), - ("Enables logging for selected levels and components. " + ("Enables logging for selected levels and components. " "RULE is in the form 'LEVEL[+][:PATTERN]' " - "Levels are one of: \n\t "+levels.str()+"\n" + "LEVEL is one of: \n\t "+levels.str()+"\n" + "PATTERN is a function name or a catogory: \n\t "+categories.str()+"\n" "For example:\n" "\t'--log-enable warning+' " "logs all warning, error and critical messages.\n" + "\t'--log-enable trace+:Broker' " + "logs all category 'Broker' messages.\n" "\t'--log-enable debug:framing' " "logs debug messages from the framing namespace. " "This option can be used multiple times").c_str()) @@ -67,6 +76,7 @@ Options::Options(const std::string& argv0_, const std::string& name_) : ("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 hi-resolution timestamps in log messages") + ("log-category", optValue(category,"yes|no"), "Include category in log messages") ("log-prefix", optValue(prefix,"STRING"), "Prefix to append to all log messages") ; add(*sinkOptions); @@ -83,6 +93,7 @@ Options::Options(const Options &o) : source(o.source), function(o.function), hiresTs(o.hiresTs), + category(o.category), trace(o.trace), prefix(o.prefix), sinkOptions (SinkOptions::create(o.argv0)) @@ -101,11 +112,12 @@ Options& Options::operator=(const Options& x) { source = x.source; function = x.function; hiresTs = x.hiresTs; + category = x.category; trace = x.trace; prefix = x.prefix; *sinkOptions = *x.sinkOptions; } return *this; } - + }} // namespace qpid::log diff --git a/qpid/cpp/src/qpid/log/Selector.cpp b/qpid/cpp/src/qpid/log/Selector.cpp index a4bc580470..8757486d88 100644 --- a/qpid/cpp/src/qpid/log/Selector.cpp +++ b/qpid/cpp/src/qpid/log/Selector.cpp @@ -37,18 +37,29 @@ void Selector::enable(const string& enableStr) { level=enableStr.substr(0,c); pattern=enableStr.substr(c+1); } + bool isCat = CategoryTraits::isCategory(pattern); 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); + ++i) { + if (isCat) { + enable(Level(i), CategoryTraits::category(pattern)); + } else { + enable(Level(i), pattern); + } + } } else { - enable(LevelTraits::level(level), pattern); + if (isCat) { + enable(LevelTraits::level(level), CategoryTraits::category(pattern)); + } else { + enable(LevelTraits::level(level), pattern); + } } } Selector::Selector(const Options& opt){ + reset(); for_each(opt.selectors.begin(), opt.selectors.end(), boost::bind(&Selector::enable, this, _1)); } @@ -58,11 +69,17 @@ bool Selector::isEnabled(Level level, const char* 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; - } + { + if (std::search(function, functionEnd, i->begin(), i->end()) != functionEnd) + return true; + } return false; } +bool Selector::isEnabled(Level level, const char* function, Category category) { + if (catFlags[level][category]) + return true; + return isEnabled(level, function); +} + }} // namespace qpid::log diff --git a/qpid/cpp/src/qpid/log/Statement.cpp b/qpid/cpp/src/qpid/log/Statement.cpp index 09d1c9449f..56ee581c80 100644 --- a/qpid/cpp/src/qpid/log/Statement.cpp +++ b/qpid/cpp/src/qpid/log/Statement.cpp @@ -50,10 +50,42 @@ std::string quote(const std::string& str) { } } +// +// Instance of name hints +// +static CategoryFileNameHints filenameHints; + + +Category CategoryFileNameHints::categoryOf(const char* const fName) { + for (std::list<std::pair<const char* const, Category> >::iterator + it = filenameHints.hintList.begin(); + it != filenameHints.hintList.end(); + ++it) { + if (strstr(fName, (const char* const)it->first) != 0) { + return it->second; + } + } + return unspecified; +} + + +void Statement::categorize(Statement& s) { + // given a statement and it's category + // if the category is Unspecified then try to find a + // better category based on the path and file name. + if (s.category == log::unspecified) { + s.category = CategoryFileNameHints::categoryOf(s.file); + } else { + // already has a category so leave it alone + } +} + + void Statement::log(const std::string& message) { Logger::instance().log(*this, quote(message)); } + Statement::Initializer::Initializer(Statement& s) : statement(s) { // QPID-3891 // From the given BOOST_CURRENT_FUNCTION name extract only the @@ -99,16 +131,22 @@ Statement::Initializer::Initializer(Statement& s) : statement(s) { // no function-name pointer to process } + Statement::categorize(s); Logger::instance().add(s); } + namespace { const char* names[LevelTraits::COUNT] = { "trace", "debug", "info", "notice", "warning", "error", "critical" }; -} // namespace +const char* catNames[CategoryTraits::COUNT] = { + "Security", "Broker", "Management", "Amqp", "System", "HA", "Messaging", + "Store", "IO", "Test", "Unspecified" +}; +} // namespace Level LevelTraits::level(const char* name) { for (int i =0; i < LevelTraits::COUNT; ++i) { if (strcmp(names[i], name)==0) @@ -121,4 +159,23 @@ const char* LevelTraits::name(Level l) { return names[l]; } +bool CategoryTraits::isCategory(const std::string& name) { + for (int i =0; i < CategoryTraits::COUNT; ++i) { + if (strcmp(catNames[i], name.c_str())==0) + return true; + } + return false; +} + +Category CategoryTraits::category(const char* name) { + for (int i =0; i < CategoryTraits::COUNT; ++i) { + if (strcmp(catNames[i], name)==0) + return Category(i); + } + throw std::runtime_error(std::string("Invalid log category name: ")+name); +} + +const char* CategoryTraits::name(Category c) { + return catNames[c]; +} }} // namespace qpid::log diff --git a/qpid/cpp/src/tests/logging.cpp b/qpid/cpp/src/tests/logging.cpp index 5d5bb1feef..47e601ed05 100644 --- a/qpid/cpp/src/tests/logging.cpp +++ b/qpid/cpp/src/tests/logging.cpp @@ -258,7 +258,7 @@ QPID_AUTO_TEST_CASE(testOverhead) { Statement statement( Level level, const char* file="", int line=0, const char* fn=0) { - Statement s={0, file, line, fn, level}; + Statement s={0, file, line, fn, level, ::qpid::log::unspecified}; return s; } |