#include "log.h" typedef void (*log_handler)( log_level_t level, const char* module, const char* file, int line, const char* message ); static void default_handler(log_level_t level, const char* module, const char* file, int line, const char* message) { if (!rt_stderr) return; const char* level_str; switch (level) { case LOG_LEVEL_DEBUG: level_str = "DEBUG"; break; case LOG_LEVEL_INFO: level_str = "INFO "; break; case LOG_LEVEL_WARN: level_str = "WARN "; break; case LOG_LEVEL_ERROR: level_str = "ERROR"; break; case LOG_LEVEL_FATAL: level_str = "FATAL"; break; case LOG_LEVEL_TRACE: level_str = "TRACE"; break; default: level_str = "NOTSET"; break; } #ifndef __LOG_NO_COLOR__ const char* color_code = ANSI_NONE; switch (level) { case LOG_LEVEL_DEBUG: color_code = ANSI_FG_CYAN; break; case LOG_LEVEL_INFO: color_code = ANSI_FG_GREEN; break; case LOG_LEVEL_TRACE: color_code = ANSI_FG_BLUE; break; case LOG_LEVEL_WARN: color_code = ANSI_FG_YELLOW; break; case LOG_LEVEL_ERROR: color_code = ANSI_FG_RED; break; case LOG_LEVEL_FATAL: color_code = ANSI_FG_RED ANSI_UNDERLINED; break; // 增强对比度 default: color_code = ANSI_NONE; } rt.fprintf(rt_stderr, ANSI_BOLD "%s[%s] - %s - %s:%d | %s" ANSI_NONE "\n", color_code, level_str, module, file, line, message); #else rt.fprintf(rt_stderr, "[%s] %s:%d | %s: %s\n", level_str, file, line, module, message); #endif if (level & LOG_LEVEL_FATAL) { rt.exit(-LOG_LEVEL_FATAL); } } static logger_t root_logger = { .name = "root", .level = LOG_LEVEL_ALL, .handler = default_handler, }; logger_t* log_get(const char* name) { return &root_logger; } void log_set_level(logger_t* logger, log_level_t level) { if (logger) logger->level = level; else root_logger.level = level; } void log_set_handler(logger_t* logger, log_handler handler) { if (logger) logger->handler = handler; else root_logger.handler = handler; }