分享一個日志系統源碼(C語言)


代碼路徑: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這個宏控制,詳細功能可以看這里

  最后歡迎提問和反饋問題,不勝感激!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM