[General] Modernize Log utility

* Reverse Log levels
* Add LOG_TRACE
* Spawn instance of Log in Get() function
new-script-api
Koncord 7 years ago
parent d6dc75e94b
commit 916ada108f

@ -153,8 +153,6 @@ int main(int argc, char *argv[])
auto version = Version::getOpenmwVersion(variables["resources"].as<Files::EscapeHashString>().toStdString()); auto version = Version::getOpenmwVersion(variables["resources"].as<Files::EscapeHashString>().toStdString());
int logLevel = mgr.getInt("logLevel", "General"); int logLevel = mgr.getInt("logLevel", "General");
if (logLevel < Log::LOG_VERBOSE || logLevel > Log::LOG_FATAL)
logLevel = Log::LOG_VERBOSE;
// Some objects used to redirect cout and cerr // Some objects used to redirect cout and cerr
// Scope must be here, so this still works inside the catch block for logging exceptions // Scope must be here, so this still works inside the catch block for logging exceptions

@ -14,41 +14,25 @@
using namespace std; using namespace std;
Log *Log::sLog = nullptr;
Log::Log(int logLevel) : logLevel(logLevel) Log::Log(int logLevel) : logLevel(logLevel)
{ {
} }
void Log::Create(int logLevel) Log &Log::Get()
{
if (sLog != nullptr)
return;
sLog = new Log(logLevel);
}
void Log::Delete()
{
if (sLog == nullptr)
return;
delete sLog;
sLog = nullptr;
}
const Log &Log::Get()
{ {
return *sLog; static Log instance(1000);
return instance;
} }
void Log::SetLevel(int level) void Log::SetLevel(int level)
{ {
sLog->logLevel = level; logLevel = level;
} }
const char* getTime() const char* getTime()
{ {
time_t t = time(0); time_t t = time(nullptr);
struct tm *tm = localtime(&t); struct tm *tm = localtime(&t);
static char result[20]; static char result[20];
sprintf(result, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", sprintf(result, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d",
@ -59,7 +43,7 @@ const char* getTime()
void Log::print(int level, bool hasPrefix, const char *file, int line, const char *message, ...) const void Log::print(int level, bool hasPrefix, const char *file, int line, const char *message, ...) const
{ {
if (level < logLevel) return; if (level > logLevel || logLevel == LOG_OFF) return;
std::stringstream sstr; std::stringstream sstr;
if (hasPrefix) if (hasPrefix)
@ -67,7 +51,7 @@ void Log::print(int level, bool hasPrefix, const char *file, int line, const cha
sstr << "[" << getTime() << "] "; sstr << "[" << getTime() << "] ";
if (file != 0 && line != 0) if (file != nullptr && line != 0)
{ {
sstr << "[" << file << ":"; sstr << "[" << file << ":";
sstr << line << "] "; sstr << line << "] ";
@ -85,6 +69,13 @@ void Log::print(int level, bool hasPrefix, const char *file, int line, const cha
case LOG_FATAL: case LOG_FATAL:
sstr << "FATAL"; sstr << "FATAL";
break; break;
case LOG_TRACE:
sstr << "TRACE";
break;
case LOG_VERBOSE:
case LOG_INFO:
sstr << "INFO";
break;
default: default:
sstr << "INFO"; sstr << "INFO";
} }
@ -108,10 +99,9 @@ void Log::print(int level, bool hasPrefix, const char *file, int line, const cha
string Log::getFilenameTimestamp() string Log::getFilenameTimestamp()
{ {
time_t rawtime = time(0); time_t rawtime = time(nullptr);
struct tm *timeinfo = localtime(&rawtime); struct tm *timeinfo = localtime(&rawtime);
char buffer[25]; char buffer[25];
strftime(buffer, 25, "%Y-%m-%d-%H_%M_%S", timeinfo); strftime(buffer, 25, "%Y-%m-%d-%H_%M_%S", timeinfo);
std::string timestamp(buffer); return string(buffer);
return timestamp;
} }

@ -17,8 +17,8 @@
#define LOG_MESSAGE(level, msg, ...) #define LOG_MESSAGE(level, msg, ...)
#define LOG_MESSAGE_SIMPLE(level, msg, ...) #define LOG_MESSAGE_SIMPLE(level, msg, ...)
#else #else
#define LOG_INIT(logLevel) Log::Create(logLevel) #define LOG_INIT(logLevel) Log::Get().SetLevel(logLevel)
#define LOG_QUIT() Log::Delete() #define LOG_QUIT()
#if defined(_MSC_VER) #if defined(_MSC_VER)
#define LOG_MESSAGE(level, msg, ...) Log::Get().print((level), (1), (__FILE__), (__LINE__), (msg), __VA_ARGS__) #define LOG_MESSAGE(level, msg, ...) Log::Get().print((level), (1), (__FILE__), (__LINE__), (msg), __VA_ARGS__)
#define LOG_MESSAGE_SIMPLE(level, msg, ...) Log::Get().print((level), (1), (0), (0), (msg), __VA_ARGS__) #define LOG_MESSAGE_SIMPLE(level, msg, ...) Log::Get().print((level), (1), (0), (0), (msg), __VA_ARGS__)
@ -35,16 +35,17 @@ class Log
public: public:
enum enum
{ {
LOG_VERBOSE = 0, LOG_OFF = 0,
LOG_INFO, LOG_FATAL,
LOG_WARN,
LOG_ERROR, LOG_ERROR,
LOG_FATAL LOG_WARN,
LOG_INFO,
LOG_VERBOSE,
LOG_TRACE,
}; };
static void Create(int logLevel);
static void Delete(); static Log &Get();
static const Log &Get(); void SetLevel(int level);
static void SetLevel(int level);
void print(int level, bool hasPrefix, const char *file, int line, const char *message, ...) const; void print(int level, bool hasPrefix, const char *file, int line, const char *message, ...) const;
static std::string getFilenameTimestamp(); static std::string getFilenameTimestamp();
@ -53,7 +54,6 @@ public:
Log &operator=(Log &) = delete; Log &operator=(Log &) = delete;
private: private:
explicit Log(int logLevel); explicit Log(int logLevel);
static Log *sLog;
int logLevel; int logLevel;
}; };

Loading…
Cancel
Save