summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2011-12-03 09:46:02 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2011-12-03 09:46:19 +0800
commit60c83540e83cf32f6fb917874c8c64c005d6d063 (patch)
tree77696cc9eb3d829f52f2a3de1ac458c0d2d9e6f9
parentebb23a4bd4ed003b25ea7b001c4ba7c0cd7148e7 (diff)
SexyAppFramework: Initial per-tag log verbose support
-rw-r--r--osframework/source/SexyAppFramework/SexyLogManager.cpp89
-rw-r--r--osframework/source/SexyAppFramework/SexyLogManager.h6
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 <ctype.h>
+
#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<std::string> tags;
+
+ Split(level, " ", tags);
+ for (size_t i = 0; i < tags.size(); i++)
+ {
+ std::vector<std::string> 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<std::string> 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<std::string, LogLevel> TagLevelMap;
+ TagLevelMap mTagLevelMap;
+
static LogManager msLogManager;
};