power_play/src/base/base_log.h

154 lines
3.5 KiB
C

////////////////////////////////////////////////////////////
//~ Log event types
Struct(LogEvent)
{
u64 id;
u64 level_id;
DateTime datetime;
i64 time_ns;
String msg;
i32 level;
i32 thread_id;
};
Struct(LogEventsArray)
{
u64 count;
LogEvent *logs;
};
////////////////////////////////////////////////////////////
//~ Logging levels
#define LogLevel(l) (l <= LogLevel_CompTime)
// Compile-time log level configuration
#ifndef LogLevel_CompTime
#if IsRtcEnabled
#define LogLevel_CompTime LogLevel_Debug
#else
#define LogLevel_CompTime LogLevel_Info
#endif
#endif
#define LogLevel_None -1
#define LogLevel_Critical 0
#define LogLevel_Error 1
#define LogLevel_Warning 2
#define LogLevel_Success 3
#define LogLevel_Info 4
#define LogLevel_Debug 5
#define LogLevel_Trace 6
#define LogLevel_COUNT 7
////////////////////////////////////////////////////////////
//~ Log level types
Struct(LogLevelSettings)
{
String shorthand;
};
Global Readonly LogLevelSettings log_settings[LogLevel_COUNT] = {
[LogLevel_Critical] = {
CompLit("CRITICAL"),
},
[LogLevel_Error] = {
CompLit("ERROR"),
},
[LogLevel_Warning] = {
CompLit("WARNING"),
},
[LogLevel_Success] = {
CompLit("SUCCESS"),
},
[LogLevel_Info] = {
CompLit("INFO"),
},
[LogLevel_Debug] = {
CompLit("DEBUG"),
},
[LogLevel_Trace] = {
CompLit("TRACE"),
},
};
////////////////////////////////////////////////////////////
//~ Compile-time logging macros
#if LogLevel(LogLevel_Critical)
#define LogCritical(msg) Log_(LogLevel_Critical, msg)
#define LogCriticalF(fmt_lit, ...) LogF_(LogLevel_Critical, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd)
#else
#define LogCritical(msg)
#define LogCriticalF(...)
#endif
#if LogLevel(LogLevel_Error)
#define LogError(msg) Log_(LogLevel_Error, msg)
#define LogErrorF(fmt_lit, ...) LogF_(LogLevel_Error, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd)
#else
#define LogError(msg)
#define LogErrorF(...)
#endif
#if LogLevel(LogLevel_Warning)
#define LogWarning(msg) Log_(LogLevel_Warning, msg)
#define LogWarningF(fmt_lit, ...) LogF_(LogLevel_Warning, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd)
#else
#define LogWarning(msg)
#define LogWarningF(...)
#endif
#if LogLevel(LogLevel_Success)
#define LogSuccess(msg) Log_(LogLevel_Success, msg)
#define LogSuccessF(fmt_lit, ...) LogF_(LogLevel_Success, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd)
#else
#define LogSuccess(msg)
#define LogSuccessF(...)
#endif
#if LogLevel(LogLevel_Info)
#define LogInfo(msg) Log_(LogLevel_Info, msg)
#define LogInfoF(fmt_lit, ...) LogF_(LogLevel_Info, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd)
#else
#define LogInfo(msg)
#define LogInfoF(...)
#endif
#if LogLevel(LogLevel_Debug)
#define LogDebug(msg) Log_(LogLevel_Debug, msg)
#define LogDebugF(fmt_lit, ...) LogF_(LogLevel_Debug, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd)
#else
#define LogDebug(msg)
#define LogDebugF(...)
#endif
#if LogLevel(LogLevel_Trace)
#define LogTrace(msg) Log_(LogLevel_Trace, msg)
#define LogTraceF(fmt_lit, ...) LogF_(LogLevel_Trace, Lit(fmt_lit) , ## __VA_ARGS__, FmtEnd)
#else
#define LogTrace(msg)
#define LogTraceF(...)
#endif
////////////////////////////////////////////////////////////
//~ @hookdecl Log
// NOTE: Calling these functions rather than using the logging macros may result in logs that are compiled regardless of log level.
void LogPanic(String msg);
void Log_(i32 level, String msg);
void LogF_(i32 level, String fmt, ...);
LogEventsArray GetLogEvents(void);