代碼路徑:https://github.com/prophetss/C-log
這是一個簡單、高效和輕量級C語言寫的的日志系統,linux下不需要第三方庫安裝。目前主要是在linux下編寫和測試,通用分支(這里)為一個基於Apache的APR(一個C語言跨平台的開源庫)編寫的跨平台版本,由於精力有限只基於最簡單的日志打印功能進行了改寫,僅供參考。
日志系統支持多線程多句柄、印級別控制、IO緩存設置、備份控制、日志文件大小控制、異常退出堆棧打印、加密(AES-128)、壓縮(lz4)和散列校驗(MD5)。所有配置和接口都在log.h內。堆棧打印是接收所有異常退出信號時打印堆棧,輸出文件名通過TRACE_PRINT_PATH宏控制,在其信號處理時還對所有日志句柄進行刷新處理,減少日志丟失可能。下面介紹下接口使用:
日志創建:
//log_filename:輸出文件名。
//max_file_size:每個文件最大上限。
//max_file_bak:最大備份文件數量,備份文件名為輸出文件名末尾+備份序號,如有其它需要可自行修改。
//max_iobuf_size:IO緩存大小,可以設為0無緩存。
//cflag:三個宏選項,NORMALIZE, ENCRYPT, COMPRESS 或者 ENCRYPT|COMPRESS,分別對應正常,只加密/壓縮,加密和壓縮。
//password:密碼,在cflag有設ENCRYPT時生效。
//返回為一個log句柄,可以創建多個,數量最大值由MAX_HANDLE_NUM宏控制。
log_t* log_create(const char *log_filename, size_t max_file_size, size_t max_file_bak, size_t max_iobuf_size, int cflag, const char *password);
刷新和銷毀為:
//刷新是將IO緩存內數據刷新到文件內,lh為創建返回的句柄指針。
void log_flush(log_t *lh);
void log_destory(log_t *lh);
日志打印:
/*日志內容可以是任意類型,由format控制(類似printf函數的format)。日志等級設置為四個宏LOG_DEBUG、LOG_INFO、LOG_WARN和LOG_ERROR(如有需要更多細分可以很方便添加擴展),代碼中低於此等級的打印不會生效,LOG_CLOSE為關閉日志功能,所有打印在編譯期間過濾不影響效率。LOG_DEBUG會額外輸出:時間 文件名【行號】線程號: ***(日志內容)。*/
#define log_debug(lh, format, ...)
#define log_info(lh, format, ...)
#define log_warn(lh, format, ...)
#define log_error(lh, format, ...)
日志解密、解壓和散列:
//in_filename:待解密文件名,解密完成不刪除
//out_filename:解密后文件名
//password:對應創建log句柄的密碼
//返回0-成功,其他-失敗。
int log_decipher(const char *in_filename, const char *out_filename, const char *password);
//src_filename:帶解壓文件,解壓完不刪除
//dst_filename:解壓后文件名
//返回0-成功,其他-失敗。解縮內部有校驗。
//注意加密是在每條日志寫入IO緩存前進行的,壓縮是備份時整個文件進行壓縮的,所以如果同時加密壓縮,先解壓再解密
int log_uncompress(const char *src_filename, const char *dst_filename);
//filename:待散列文件名
//digest:輸出轉化為32個十六進制字符,如果digest為NULL,內部會自動申請內存,否則其size至少應為33(32加尾部'\0')
//返回:digest
char* log_md5(const char *filename, char *digest);
所有具體使用有個簡單測試例子在sample文件夾內,直接make就可以生成,詳細可看代碼,內部還有一個多線程安全時間計時器可以精確到納秒,計數器個數可以由TIMEKEEPER_NUM這個宏控制,詳細功能可以看這里。
最后歡迎提問和反饋問題,不勝感激!