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

C語言實現日誌記錄功能:帶時間戳的靈活寫入方案

     編輯:關於C語言

C語言實現日誌記錄功能:帶時間戳的靈活寫入方案

在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") 確保多次執行不會覆蓋歷史日誌。

擴充建議

實際專案中可進一步增強:

  • 新增日誌等級(DEBUG/INFO/WARN/ERROR)並支援過濾
  • 實現日誌輪轉(按大小或日期分割檔案)
  • 支援多執行緒環境下的鎖機制
  • 提供非同步寫入以提升效能

此實作簡潔高效,適合嵌入式系統、伺服器後端等對效能敏感的 C 語言專案作為基礎日誌模組。

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