#ifndef LOG_H #define LOG_H #include // 使用 std::time 和 std::strftime #include // 使用 printf #include // 使用 va_list 和 va_start #include // 使用 std::mutex // 定义打印等级 #define LOG_LEVEL_DEBUG 0 #define LOG_LEVEL_INFO 1 #define LOG_LEVEL_WARN 2 #define LOG_LEVEL_ERROR 3 // 默认日志等级为INFO #ifndef LOG_LEVEL #define LOG_LEVEL LOG_LEVEL_DEBUG #endif // 颜色配置:用户空间启用颜色 #define LOG_COLOR true // 颜色宏定义 #if LOG_COLOR #define RESET_COLOR "\033[0m" #define COLOR_DEBUG "\033[34m" // 蓝色 #define COLOR_INFO "\033[32m" // 绿色 #define COLOR_WARN "\033[33m" // 黄色 #define COLOR_ERROR "\033[31m" // 红色 #else #define RESET_COLOR "" #define COLOR_DEBUG "" #define COLOR_INFO "" #define COLOR_WARN "" #define COLOR_ERROR "" #endif // 获取当前时间的字符串(用户空间实现) inline const char* current_time() { static char buffer[64]; std::time_t now = std::time(nullptr); std::tm* tm_now = std::localtime(&now); std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tm_now); return buffer; } // 定义一个静态互斥锁,保证线程安全 static std::mutex log_mutex; // 定义一个外部 FILE 变量,可以用来切换输出目标 extern FILE* log_output; // 默认为 stdout // 用户空间打印日志 #define LOG(level, format, ...) do {\ if (level >= LOG_LEVEL) {\ std::lock_guard lock(log_mutex); /* 自动锁住互斥锁 */\ const char *level_str;\ const char *color;\ switch (level) {\ case LOG_LEVEL_DEBUG: level_str = "[DEBUG]"; color = COLOR_DEBUG; break;\ case LOG_LEVEL_INFO: level_str = "[INFO]"; color = COLOR_INFO; break;\ case LOG_LEVEL_WARN: level_str = "[WARN]"; color = COLOR_WARN; break;\ case LOG_LEVEL_ERROR: level_str = "[ERROR]"; color = COLOR_ERROR; break;\ default: level_str = "[UNKNOWN]"; color = ""; break;\ }\ fprintf(log_output, "%s%s %s %s:%d - ", color, current_time(), level_str, __FILE__, __LINE__);\ fprintf(log_output, format, ##__VA_ARGS__); /* 打印日志信息 */\ fprintf(log_output, "%s\n", RESET_COLOR);\ fflush(log_output); /* 强制刷新到指定输出目标 */\ }\ } while (0) // 简便宏,用于各个等级的日志 #define LOG_DEBUG(format, ...) LOG(LOG_LEVEL_DEBUG, format, ##__VA_ARGS__) #define LOG_INFO(format, ...) LOG(LOG_LEVEL_INFO, format, ##__VA_ARGS__) #define LOG_WARN(format, ...) LOG(LOG_LEVEL_WARN, format, ##__VA_ARGS__) #define LOG_ERROR(format, ...) LOG(LOG_LEVEL_ERROR, format, ##__VA_ARGS__) #endif // LOG_H