From 60c83540e83cf32f6fb917874c8c64c005d6d063 Mon Sep 17 00:00:00 2001 From: Luo Jinghua Date: Sat, 3 Dec 2011 09:46:02 +0800 Subject: SexyAppFramework: Initial per-tag log verbose support --- .../source/SexyAppFramework/SexyLogManager.cpp | 89 +++++++++++++++++++--- .../source/SexyAppFramework/SexyLogManager.h | 6 ++ 2 files changed, 86 insertions(+), 9 deletions(-) diff --git a/osframework/source/SexyAppFramework/SexyLogManager.cpp b/osframework/source/SexyAppFramework/SexyLogManager.cpp index 0f8ee7a..cc6bc0c 100644 --- a/osframework/source/SexyAppFramework/SexyLogManager.cpp +++ b/osframework/source/SexyAppFramework/SexyLogManager.cpp @@ -6,6 +6,8 @@ #include "TcpLogListener.h" #include "Common.h" +#include + #if defined(ANDROID) || defined(__ANDROID__) #include "AndroidLogListener.h" #endif @@ -13,8 +15,12 @@ using namespace Sexy; #ifndef SEXY_LOG +#ifdef SEXY_DEBUG +#define SEXY_LOG "default;tcp" +#else #define SEXY_LOG "" #endif +#endif LogManager LogManager::msLogManager; @@ -25,9 +31,40 @@ LogManager::LogManager() mVerboseLevel = LOG_INFO; + // SEXY_LOG_LEVEL={0,1,2,3} + // SEXY_LOG_LEVEL={debug,info,warn,error} + // SEXY_LOG_LEVEL="*:error abc:debug" const char* level = GetEnv("SEXY_LOG_LEVEL"); - if (level && !logLevelFromName(level, mVerboseLevel)) - mVerboseLevel = LogLevel(GetEnvIntOption("SEXY_LOG_LEVEL", mVerboseLevel)); + if (level && *level) + { + std::string lvl(level); + std::vector tags; + + Split(level, " ", tags); + for (size_t i = 0; i < tags.size(); i++) + { + std::vector kv; + + Split(tags[i], ":", kv); + if (kv.size() != 2) + continue; + + LogLevel logLvl = mVerboseLevel; + if (!logLevelFromName(kv[0].c_str(), logLvl)) + logLvl = LogLevel(atoi(kv[0].c_str())); + + if (kv[0] == "*") + mVerboseLevel = logLvl; + else + mTagLevelMap[kv[0]] = logLvl; + } + + if (tags.size() == 1 && lvl.find(':') == std::string::npos && + !logLevelFromName(level, mVerboseLevel)) + mVerboseLevel = + LogLevel(GetEnvIntOption("SEXY_LOG_LEVEL", + mVerboseLevel)); + } mName = "default"; mDefaultTag = "default"; mDefaultFormat = LogFormat(LOG_FORMAT_TAG | LOG_FORMAT_PID | LOG_FORMAT_TIMESTAMP); @@ -38,19 +75,44 @@ LogManager::LogManager() LogManager::~LogManager() { + close(); +} + +LogManager& LogManager::getInstance() +{ + return msLogManager; +} + +void LogManager::close() +{ + if (!mListener && !mDefaultListener) + return; + + log(LOG_DEBUG, "log", "Closing log, byte..."); setListener(0); delete mDefaultListener; + mDefaultListener = 0; } -LogManager& LogManager::getInstance() +void LogManager::resetToPlatformListener() { - return msLogManager; + // Reset to the defualt listener + resetListener(); + + // Delete the old the default listener + mListener = 0; + delete mDefaultListener; + + // Setup a new default listener with the default listener only + mDefaultListener = new MultiplexLogListener(); + mDefaultListener->addListener(createListener("default")); + resetListener(); } void LogManager::release() { - msLogManager.resetListener(); + msLogManager.resetToPlatformListener(); } LogListener* LogManager::createListener(const std::string& target) @@ -67,6 +129,10 @@ LogListener* LogManager::createListener(const std::string& target) { listener = new TcpLogListener(target); } + else if (target == "stdout") + { + listener = new DefaultLogListener(); + } else if (target == "default") { #if defined(ANDROID) || defined(__ANDROID__) @@ -81,15 +147,12 @@ LogListener* LogManager::createListener(const std::string& target) void LogManager::setupDefaultListener() { - if (mListener) + if (mListener || mSetupCount) return; { AutoCrit anAutoCrit(mCritSect); - if (mSetupCount) - return; - mSetupCount++; std::vector targets; @@ -169,6 +232,14 @@ void LogManager::setDefaultFormat(LogFormat format) mDefaultFormat = format; } +LogLevel LogManager::getVerboseLevel(const std::string& tag) +{ + TagLevelMap::iterator it = mTagLevelMap.find(tag); + if (it != mTagLevelMap.end()) + return it->second; + return mVerboseLevel; +} + void LogManager::log(LogLevel lvl, const std::string& tag, const std::string& s) { setupDefaultListener(); diff --git a/osframework/source/SexyAppFramework/SexyLogManager.h b/osframework/source/SexyAppFramework/SexyLogManager.h index 2024440..8e2c40b 100644 --- a/osframework/source/SexyAppFramework/SexyLogManager.h +++ b/osframework/source/SexyAppFramework/SexyLogManager.h @@ -16,11 +16,13 @@ namespace Sexy { static LogManager& getInstance(); static void release(); + void close(); void silent(); void setListener(LogListener* listener); void log(LogLevel lvl, const std::string& tag, const std::string& s); void setVerboseLevel(LogLevel lvl); LogLevel getVerboseLevel(); + LogLevel getVerboseLevel(const std::string& tag); std::string getDefaultTag(); void setDefaultTag(const std::string& tag); std::string getName(); @@ -32,6 +34,7 @@ namespace Sexy { void setupDefaultListener(); LogListener* createListener(const std::string& target); void resetListener(); + void resetToPlatformListener(); private: CritSect mCritSect; @@ -44,6 +47,9 @@ namespace Sexy { std::string mDefaultTarget; std::string mName; + typedef std::map TagLevelMap; + TagLevelMap mTagLevelMap; + static LogManager msLogManager; }; -- cgit v1.2.3