extend logger (#34)

This commit is contained in:
redPanther 2016-06-21 21:41:26 +02:00 committed by brindosch
parent eccd4e6637
commit f48af9daff
3 changed files with 57 additions and 17 deletions

View File

@ -25,9 +25,11 @@
class Logger class Logger
{ {
public: public:
enum LogLevel { DEBUG=0, INFO=1,WARNING=2,ERROR=3 }; enum LogLevel { UNSET=0,DEBUG=1, INFO=2,WARNING=3,ERROR=4 };
static Logger* getInstance(std::string name="", LogLevel minLevel=Logger::INFO); static Logger* getInstance(std::string name="", LogLevel minLevel=Logger::INFO);
static void deleteInstance(std::string name="");
static void setLogLevel(LogLevel level,std::string name="");
void Message(LogLevel level, const char* sourceFile, const char* func, unsigned int line, const char* fmt, ...); void Message(LogLevel level, const char* sourceFile, const char* func, unsigned int line, const char* fmt, ...);
void setMinLevel(LogLevel level) { _minLevel = level; }; void setMinLevel(LogLevel level) { _minLevel = level; };
@ -38,6 +40,7 @@ protected:
private: private:
static std::map<std::string,Logger*> *LoggerMap; static std::map<std::string,Logger*> *LoggerMap;
static LogLevel GLOBAL_MIN_LOG_LEVEL;
std::string _name; std::string _name;
std::string _appname; std::string _appname;

View File

@ -13,31 +13,67 @@ std::string getBaseName( std::string sourceFile)
return fi.fileName().toStdString(); return fi.fileName().toStdString();
} }
static const char * LogLevelStrings[] = { "DEBUG", "INFO", "WARNING", "ERROR" }; static const char * LogLevelStrings[] = { "", "DEBUG", "INFO", "WARNING", "ERROR" };
static const int LogLevelSysLog[] = { LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERR }; static const int LogLevelSysLog[] = { LOG_DEBUG, LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERR };
static unsigned int loggerCount = 0; static unsigned int loggerCount = 0;
static unsigned int loggerId = 0; static unsigned int loggerId = 0;
std::map<std::string,Logger*> *Logger::LoggerMap = nullptr; std::map<std::string,Logger*> *Logger::LoggerMap = nullptr;
Logger::LogLevel Logger::GLOBAL_MIN_LOG_LEVEL = Logger::UNSET;
Logger* Logger::getInstance(std::string name, Logger::LogLevel minLevel) Logger* Logger::getInstance(std::string name, Logger::LogLevel minLevel)
{ {
if (Logger::LoggerMap == nullptr) if (LoggerMap == nullptr)
{ {
Logger::LoggerMap = new std::map<std::string,Logger*>; LoggerMap = new std::map<std::string,Logger*>;
} }
if ( LoggerMap->find(name) == LoggerMap->end() ) if ( LoggerMap->find(name) == LoggerMap->end() )
{ {
Logger* log = new Logger(name,minLevel); Logger* log = new Logger(name,minLevel);
Logger::LoggerMap->insert(std::pair<std::string,Logger*>(name,log)); // compat version, replace it with following line if we have 100% c++11 LoggerMap->insert(std::pair<std::string,Logger*>(name,log)); // compat version, replace it with following line if we have 100% c++11
//Logger::LoggerMap->emplace(name,log); // not compat with older linux distro's e.g. wheezy //LoggerMap->emplace(name,log); // not compat with older linux distro's e.g. wheezy
return log; return log;
} }
return Logger::LoggerMap->at(name); return LoggerMap->at(name);
} }
void Logger::deleteInstance(std::string name)
{
if (LoggerMap == nullptr)
return;
if ( name.empty() )
{
std::map<std::string,Logger*>::iterator it;
for ( it=LoggerMap->begin(); it != LoggerMap->end(); it++)
{
delete it->second;
}
LoggerMap->clear();
}
else if (LoggerMap->find(name) != LoggerMap->end())
{
delete LoggerMap->at(name);
LoggerMap->erase(name);
}
}
void Logger::setLogLevel(LogLevel level,std::string name)
{
if ( name.empty() )
{
GLOBAL_MIN_LOG_LEVEL = level;
}
else
{
Logger* log = Logger::getInstance(name,level);
log->setMinLevel(level);
}
}
Logger::Logger ( std::string name, LogLevel minLevel ): Logger::Logger ( std::string name, LogLevel minLevel ):
@ -55,11 +91,6 @@ Logger::Logger ( std::string name, LogLevel minLevel ):
loggerCount++; loggerCount++;
// if (pLoggerMap == NULL)
// pLoggerMap = new std::map<unsigned int,Logger*>;
//
//
if (_syslogEnabled && loggerCount == 1 ) if (_syslogEnabled && loggerCount == 1 )
{ {
openlog (program_invocation_short_name, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL0); openlog (program_invocation_short_name, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL0);
@ -68,7 +99,7 @@ Logger::Logger ( std::string name, LogLevel minLevel ):
Logger::~Logger() Logger::~Logger()
{ {
//LoggerMap.erase(_loggerId); Debug(this, "logger '%s' destroyed", _name.c_str() );
loggerCount--; loggerCount--;
if ( loggerCount == 0 ) if ( loggerCount == 0 )
closelog(); closelog();
@ -77,9 +108,11 @@ Logger::~Logger()
void Logger::Message(LogLevel level, const char* sourceFile, const char* func, unsigned int line, const char* fmt, ...) void Logger::Message(LogLevel level, const char* sourceFile, const char* func, unsigned int line, const char* fmt, ...)
{ {
if ( level < _minLevel ) if ( (GLOBAL_MIN_LOG_LEVEL == Logger::UNSET && level < _minLevel) // no global level, use level from logger
|| (GLOBAL_MIN_LOG_LEVEL > Logger::UNSET && level < GLOBAL_MIN_LOG_LEVEL) ) // global level set, use global level
return; return;
char msg[512]; char msg[512];
va_list args; va_list args;
va_start (args, fmt); va_start (args, fmt);

View File

@ -39,7 +39,9 @@ void startNewHyperion(int parentPid, std::string hyperionFile, std::string confi
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
Logger* log = Logger::getInstance("MAIN", Logger::INFO); // initialize main logger and set global log level
Logger* log = Logger::getInstance("MAIN");
Logger::setLogLevel(Logger::INFO);
// Initialising QCoreApplication // Initialising QCoreApplication
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
@ -125,8 +127,10 @@ int main(int argc, char** argv)
int rc = app.exec(); int rc = app.exec();
Info(log, "INFO: Application closed with code %d", rc); Info(log, "INFO: Application closed with code %d", rc);
// delete components
delete webConfig; delete webConfig;
delete hyperiond; delete hyperiond;
Logger::deleteInstance();
return rc; return rc;
} }