// file : core/logger.c // project : Salis-VM // author : Paul Oliver // index: // [section] includes // [section] macros // [section] definitions // ---------------------------------------------------------------------------- // [section] includes // ---------------------------------------------------------------------------- #include #include #include #include #include #include "logger.h" // ---------------------------------------------------------------------------- // [section] macros // ---------------------------------------------------------------------------- #define LOG_BUFFER_SIZE 0x800 #define COLOR_CLEAR "\033[0m" #define COLOR_TRACE "\033[1;34m" #define COLOR_INFO "\033[1;32m" #define COLOR_ATTENTION "\033[1;33m" #define LEVEL_TRACE "TRACE" #define LEVEL_INFO "INFO" #define LEVEL_ATTENTION "ATTENTION" // ---------------------------------------------------------------------------- // [section] definitions // ---------------------------------------------------------------------------- static void log_default(const char *color_code, const char *level, const char *format, va_list args) { assert(level); assert(format); char log_buffer[LOG_BUFFER_SIZE]; struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); int msec = (int)(ts.tv_nsec / 1000000l); struct tm tm = *localtime(&ts.tv_sec); pid_t pid = getpid(); int rem = snprintf( log_buffer, LOG_BUFFER_SIZE, "\r%s%d-%02d-%02d %02d:%02d:%02d.%03d %07d [%s]%s ", color_code ? color_code : "", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, msec, pid, level, color_code ? COLOR_CLEAR : "" ); vsnprintf(log_buffer + rem, LOG_BUFFER_SIZE - rem, format, args); printf("%s\n", log_buffer); fflush(stdout); } void log_trace(const char *format, ...) { assert(format); #if defined(LOG_TRACE) va_list args; va_start(args, format); log_default(COLOR_TRACE, LEVEL_TRACE, format, args); va_end(args); #else (void)format; #endif } void log_info(const char *format, ...) { assert(format); va_list args; va_start(args, format); log_default(COLOR_INFO, LEVEL_INFO, format, args); va_end(args); } void log_attention(const char *format, ...) { assert(format); va_list args; va_start(args, format); log_default(COLOR_ATTENTION, LEVEL_ATTENTION, format, args); va_end(args); }