在C語言開發中,日誌記錄是除錯、監控和審計的基礎工具。本文介紹一個輕量級的日誌寫入函數 write_log,它支援可變參數格式化,並自動在每行開頭加入精確到秒的時間戳,方便追蹤程式執行流程。
以下是完整的 log.c 原始碼,包含日誌函數與測試主程式:
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
int write_log(FILE* pFile, const char *format, ...) {
va_list arg;
int done;
va_start(arg, format);
// 獲取當前本地時間
time_t time_log = time(NULL);
struct tm* tm_log = localtime(&time_log);
// 寫入時間戳:YYYY-MM-DD HH:MM:SS
fprintf(pFile, "%04d-%02d-%02d %02d:%02d:%02d ",
tm_log->tm_year + 1900,
tm_log->tm_mon + 1,
tm_log->tm_mday,
tm_log->tm_hour,
tm_log->tm_min,
tm_log->tm_sec);
// 寫入格式化日誌內容
done = vfprintf(pFile, format, arg);
va_end(arg);
// 立即刷新緩衝區,確保日誌即時落盤
fflush(pFile);
return done;
}
int main() {
// 以追加模式開啟日誌檔案
FILE* pFile = fopen("123.txt", "a");
if (pFile == NULL) {
perror("無法開啟日誌檔案");
return 1;
}
// 測試呼叫:支援字串、整數、浮點數等多種型別
write_log(pFile, "%s %d %f\n", "is running", 10, 55.55);
fclose(pFile);
return 0;
}
使用 GCC 編譯並執行:
gcc log.c -o log ./log
執行後,123.txt 將包含類似以下內容:
2016-12-13 13:10:02 is running 10 55.550000 2016-12-13 13:10:04 is running 10 55.550000 2016-12-13 13:10:04 is running 10 55.550000
stdarg.h 的 va_list、va_start、va_end 實現類 printf 的彈性介面。time() 取得秒數,localtime() 轉換為本地時間結構體,格式化輸出年月日時分秒。fflush() 強制刷新檔案緩衝區,避免程式異常終止導致日誌遺失。fopen(..., "a") 確保多次執行不會覆蓋歷史日誌。實際專案中可進一步增強:
此實作簡潔高效,適合嵌入式系統、伺服器後端等對效能敏感的 C 語言專案作為基礎日誌模組。