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

Windows 下分級日志系統的 C 語言實現詳解

     編輯:關於C語言

項目背景與設計目標

本文呈現一個適用於 Windows 平台的輕量級日志庫,支持按日期分目錄、按類型分文件(信息/錯誤/系統)、大小滾動覆蓋、可變參數格式化輸出,代碼結構清晰,便於移植或封裝為動態庫。

核心功能特性

  • 目錄結構:C:/My_APPLOG/YYYYMMDD/ 每日獨立目錄
  • 三類日志文件:app_info.log、app_error.log、app_system.log
  • 文件大小控制:單文件超 512KB 自動覆蓋重寫
  • 線程不安全:單線程場景足夠,多線程需自行加鎖
  • 編譯開關:_LOG_WRITE_STATE_ 宏控制是否啟用,零開銷編譯裁剪

關鍵數據結構

#pragma pack(push, 1)
typedef struct tagLOG_DATA {
    char strDate[11];      // "YYYY-MM-DD"
    char strTime[9];       // "HH:MM:SS"
    unsigned int iType;    // 0:INFO, 1:ERROR, 2:SYSTEM
    char strText[2048];    // 日志正文
} LOG_DATA, *LPLOG_DATA;
#pragma pack(pop)

使用 #pragma pack(1) 確保結構體緊湊對齊,便於二進制寫入或跨模塊傳遞。

核心流程解析

1. 入口函數 Write_Log

  • 變參 va_list 格式化生成正文
  • 調用 time/localtime/strftime 獲取當前日期時間
  • 填充 LOG_DATA 結構體,轉交 Write_Log_Text

2. 路徑構建 GetLogPath / Create_LogDir

  • 根據當前日期生成 YYYYMMDD 目錄名
  • 逐層調用 CreateDirectory 創建多級目錄(兼容深層路徑)
  • 處理 ERROR_ALREADY_EXISTS 避免重複創建報錯

3. 文件管理 GetLogFileName / Create_LogFile

  • 根據類型確定文件前綴
  • FindFirstFile 檢查文件是否存在及大小
  • 超過 MAX_LOG_FILE_SIZE 時調用 CreateFile(CREATE_ALWAYS) 截斷重建
  • 正常情況下以 "a+" 模式追加寫入

4. 寫入落盤 Write_Log_Text

sprintf(szLogText, "%s %s %s\n", date, time, text);
fwrite(szLogText, 1, strlen(szLogText), pFile);

格式:[日期] [時間] [正文],換行分隔。

測試用例與輸出示例

int main() {
    Write_Log(LOG_TYPE_SYSTEM, "Program begin.");
    TestLogCase_One(); // 內部演示文件讀取與各類日志調用
    Write_Log(LOG_TYPE_SYSTEM, "Program end.");
    return 0;
}

生成文件示例(app_info.log):

2024-05-20 14:30:01 malloc memory for pFiled successful,memory size is: 1024
2024-05-20 14:30:01 Open file test_case.txt successful.
2024-05-20 14:30:01 The file test_case.txt content is:
Hello World

已知局限與改進方向

  1. 時間精度:time() 僅秒級,高頻場景建議用 GetSystemTimePreciseAsFileTime 或 QueryPerformanceCounter。
  2. 跨平台:當前依賴 Windows API(CreateDirectory, FindFirstFile 等),移植 Linux 需抽象文件系統接口。
  3. 上下文信息:可增加 __FILE__, __LINE__, __FUNCTION__ 宏自動記錄調用位置。
  4. 異步寫入:生產環境建議生產者-消費者隊列 + 專用寫入線程,避免阻塞業務邏輯。
  5. 封裝升級:重構為 C++ 類或導出 DLL 接口,支持運行時動態調整級別、路徑、格式。

總結

這個日志系統雖簡樸,但涵蓋了「分類、分目錄、滾動、格式化」工業級日志的核心要素,代碼閱讀性強,極適合作為學習 C 語言文件操作、Windows API、變參處理的教學樣本,也可作為小型項目直接集成的起點。

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