55 LOG_LEVEL_WARNING = 20,
58 LOG_LEVEL_VERBOSE = 50
67 typedef std::function<void (
const LogMessage&)> LogFunction;
68 typedef int LogFunctionID;
73 LogFuncEntry(LogFunction f, LogFunctionID
id) : f(f), id(id) {}
80 static RMonoLogger& getInstance()
82 static RMonoLogger inst;
86 void setLogLevel(LogLevel level) { this->level = level; }
87 LogLevel getLogLevel()
const {
return level; }
89 const char* getLogLevelName(LogLevel level)
92 case LOG_LEVEL_NONE:
return "none";
93 case LOG_LEVEL_ERROR:
return "error";
94 case LOG_LEVEL_WARNING:
return "warning";
95 case LOG_LEVEL_INFO:
return "info";
96 case LOG_LEVEL_DEBUG:
return "debug";
97 case LOG_LEVEL_VERBOSE:
return "verbose";
102 bool isLogLevelActive(LogLevel level) {
return this->level >= level; }
104 LogFunctionID registerLogFunction(LogFunction f)
106 LogFunctionID
id = nextLogFuncID++;
107 logFuncs.emplace_back(f,
id);
111 bool unregisterLogFunction(LogFunctionID
id)
113 for (
auto it = logFuncs.begin() ; it != logFuncs.end() ; it++) {
122 template <
typename... Args>
123 void logMessageUnchecked(LogLevel level,
const char* fmt, Args... args)
125 logMessagevUnchecked(level, fmt, std::forward<Args>(args)...);
128 template <
typename... Args>
129 void logMessage(LogLevel level,
const char* fmt, Args... args)
131 if (isLogLevelActive(level) && !logFuncs.empty()) {
132 logMessageUnchecked(level, fmt, args...);
137 RMonoLogger() : level(LOG_LEVEL_INFO), nextLogFuncID(1)
139 mtx = CreateMutex(NULL,
false, NULL);
142 void lockMutex() { WaitForSingleObject(mtx, INFINITE); }
143 void unlockMutex() { ReleaseMutex(mtx); }
145 void logMessagevlUnchecked(LogLevel level,
const char* fmt, va_list args)
153 va_copy(argsCpy, args);
154 int len = vsnprintf(
nullptr, 0, fmt, argsCpy);
157 char* msgStr =
new char[len+1];
159 va_copy(argsCpy, args);
160 vsnprintf(msgStr, len+1, fmt, argsCpy);
164 msg.msg = std::string_view(msgStr, len);
167 for (LogFuncEntry& e : logFuncs) {
176 void logMessagevUnchecked(LogLevel level,
const char* fmt, ...)
180 logMessagevlUnchecked(level, fmt, args);
186 std::list<LogFuncEntry> logFuncs;
187 LogFunctionID nextLogFuncID;
210 void registerLogFunction()
212 logFuncID = RMonoLogger::getInstance().registerLogFunction(*
this);
215 bool unregisterLogFunction()
217 bool res = RMonoLogger::getInstance().unregisterLogFunction(logFuncID);
224 time_t t = time(NULL);
226 const char* typeCode =
"[???]";
229 case RMonoLogger::LOG_LEVEL_ERROR:
232 case RMonoLogger::LOG_LEVEL_WARNING:
235 case RMonoLogger::LOG_LEVEL_INFO:
238 case RMonoLogger::LOG_LEVEL_DEBUG:
241 case RMonoLogger::LOG_LEVEL_VERBOSE:
249 localtime_s(&localTime, &t);
250 strftime(timeStr,
sizeof(timeStr), timeFormat.data(), &localTime);
252 printf(
"%s %s - %s\n", typeCode, timeStr, msg.msg.data());
256 void setTimeFormat(
const std::string& format) { timeFormat = format; }
262 std::string timeFormat =
"%Y-%m-%d %H:%M:%S";
263 RMonoLogger::LogFunctionID logFuncID = 0;
271 template <
class... T>
void RMonoLogError(
const char* fmt, T... args) { RMonoLogger::getInstance().logMessage(RMonoLogger::LOG_LEVEL_ERROR, fmt, std::forward<T>(args)...); }
272 template <
class... T>
void RMonoLogWarning(
const char* fmt, T... args) { RMonoLogger::getInstance().logMessage(RMonoLogger::LOG_LEVEL_WARNING, fmt, std::forward<T>(args)...); }
273 template <
class... T>
void RMonoLogInfo(
const char* fmt, T... args) { RMonoLogger::getInstance().logMessage(RMonoLogger::LOG_LEVEL_INFO, fmt, std::forward<T>(args)...); }
274 template <
class... T>
void RMonoLogDebug(
const char* fmt, T... args) { RMonoLogger::getInstance().logMessage(RMonoLogger::LOG_LEVEL_DEBUG, fmt, std::forward<T>(args)...); }
275 template <
class... T>
void RMonoLogVerbose(
const char* fmt, T... args) { RMonoLogger::getInstance().logMessage(RMonoLogger::LOG_LEVEL_VERBOSE, fmt, std::forward<T>(args)...); }