81 lines
2.7 KiB
C++
81 lines
2.7 KiB
C++
#ifndef LOG_H
|
|
#define LOG_H
|
|
|
|
#include <ctime> // 使用 std::time 和 std::strftime
|
|
#include <cstdio> // 使用 printf
|
|
#include <cstdarg> // 使用 va_list 和 va_start
|
|
#include <mutex> // 使用 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<std::mutex> 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
|