首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言極簡日誌輸出巨集:支援等級過濾與時間戳

     編輯:關於C語言

C 語言極簡日誌輸出巨集:支援等級過濾與時間戳

設計目標

  • 單一 .h 檔即可使用,無需額外 .c
  • 支援 5 級日誌:DBG、INFO、WRN、ERR、OUT
  • 全域 verbose 控制輸出等級門檻
  • 自動附加時間戳(精確到秒)
  • 語法與 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 分離、支援檔案輪轉、非同步寫入的完整版本(見原文圖片),適合正式專案;本極簡版適合快速原型、嵌入式或單檔案工具。

適用場景

  • 快速加入除錯輸出,無需引入重型日誌庫
  • 跨平台專案統一除錯介面
  • 教學示範巨集技巧與可變參數用法

只需將巨集貼入專案通用標頭檔,即刻擁有專業級日誌輸出能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved