.h 檔即可使用,無需額外 .cDBG、INFO、WRN、ERR、OUTverbose 控制輸出等級門檻printf 完全一致extern int verbose; // 全域等級變數,需在某 .c 定義
#define DBG(...) XLOG(4, "DBG", __VA_ARGS__)
#define INFO(...) XLOG(3, "INF", __VA_ARGS__)
#define WRN(...) XLOG(2, "WRN", __VA_ARGS__)
#define ERR(...) XLOG(1, "ERR", __VA_ARGS__)
#define OUT(...) XLOG(0, "OUT", __VA_ARGS__)
#define XLOG(level, LOG_LEVEL, ...) \
do { \
if (verbose >= (level)) { \
time_t _tm = 0; \
struct tm log_tm = {0}; \
time(&_tm); \
localtime_r(&_tm, &log_tm); \
fprintf(stdout, "%04d-%02d-%02d %02d:%02d:%02d %3s | ", \
log_tm.tm_year+1900, log_tm.tm_mon+1, log_tm.tm_mday, \
log_tm.tm_hour, log_tm.tm_min, log_tm.tm_sec, LOG_LEVEL); \
fprintf(stdout, __VA_ARGS__); \
} \
} while(0)
verbose = 3; // 只輸出 INFO 以上等級
DBG("Debug info: %d\n", 123); // 不會輸出
INFO("Server started on port %d\n", 8080); // 會輸出
ERR("Connection failed: %s\n", strerror(errno));
2024-01-15 14:30:45 INF | Server started on port 8080
2024-01-15 14:30:46 ERR | Connection failed: Connection refused
作者另提供一個需 .c/.h 分離、支援檔案輪轉、非同步寫入的完整版本(見原文圖片),適合正式專案;本極簡版適合快速原型、嵌入式或單檔案工具。
只需將巨集貼入專案通用標頭檔,即刻擁有專業級日誌輸出能力。