本文呈現一個適用於 Windows 平台的輕量級日志庫,支持按日期分目錄、按類型分文件(信息/錯誤/系統)、大小滾動覆蓋、可變參數格式化輸出,代碼結構清晰,便於移植或封裝為動態庫。
C:/My_APPLOG/YYYYMMDD/ 每日獨立目錄app_info.log、app_error.log、app_system.log_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) 確保結構體緊湊對齊,便於二進制寫入或跨模塊傳遞。
Write_Logva_list 格式化生成正文time/localtime/strftime 獲取當前日期時間LOG_DATA 結構體,轉交 Write_Log_TextGetLogPath / Create_LogDirYYYYMMDD 目錄名CreateDirectory 創建多級目錄(兼容深層路徑)ERROR_ALREADY_EXISTS 避免重複創建報錯GetLogFileName / Create_LogFileFindFirstFile 檢查文件是否存在及大小MAX_LOG_FILE_SIZE 時調用 CreateFile(CREATE_ALWAYS) 截斷重建"a+" 模式追加寫入Write_Log_Textsprintf(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
time() 僅秒級,高頻場景建議用 GetSystemTimePreciseAsFileTime 或 QueryPerformanceCounter。CreateDirectory, FindFirstFile 等),移植 Linux 需抽象文件系統接口。__FILE__, __LINE__, __FUNCTION__ 宏自動記錄調用位置。這個日志系統雖簡樸,但涵蓋了「分類、分目錄、滾動、格式化」工業級日志的核心要素,代碼閱讀性強,極適合作為學習 C 語言文件操作、Windows API、變參處理的教學樣本,也可作為小型項目直接集成的起點。