1. 程式人生 > >介紹一個headonly的log庫easylogging++

介紹一個headonly的log庫easylogging++

因為TX的log要求按照小時滾動,並且按照大小滾動,原來的glog設定完大小後,容量了就不會再寫入了,而且按小時滾動也很麻煩,所以就找了找其他的log庫。

主要要求簡單上手,支援大小和時間滾動,不需要改動太多。

看了之前用過的log4cxx等庫,發現編譯成靜態檔案後太大了,我們又必須要求靜態,所以就很麻煩。

github上找到了一個easylogging++的庫,headonly,只有一個頭檔案,看起來非常炫酷,決定試一試,結果上手確實很簡單,支援配置,配置也很強大

專案地址:https://github.com/easylogging/easyloggingpp

一個簡單的使用例子:

C++
1234567891011121314151617181920212223242526272829#include "boost/filesystem.hpp"#include "easylog/easylogging++.h"INITIALIZE_EASYLOGGINGPPstaticunsignedintidx=0;voidrolloutHandler(constchar*filename,std::size_t size){std::stringstream stream;stream<<filename<<"."<<++idx;boost::filesystem
::rename(filename,stream.str().c_str());}intmain(intargc,char**argv){el::Loggers::addFlag(el::LoggingFlag::StrictLogFileSizeCheck);el::Configurations conf("log.conf");el::Loggers::reconfigureAllLoggers(conf);el::Helpers::installPreRollOutCallback(rolloutHandler);for(inti=0;i<100000;++i){LOG(INFO)<<
"Test==========================================================";}el::Helpers::uninstallPreRollOutCallback();return0;}

上面註冊過滾動函式後就可以按照大小滾動了,不過注意一定要加上StrictLogFileSizeCheck的flag。

按照小時滾動的我加了一些簡單粗暴的程式碼實現了,就不放出來獻醜了,如果大家需要,可以單獨找我獲取。

其中log.conf是配置檔案,大致內容如下:

C++
1234567891011121314151617181920212223242526272829303132*GLOBAL:FORMAT="[%level | %datetime] | %msg"ENABLED=trueTO_FILE=trueTO_STANDARD_OUTPUT=trueMILLISECONDS_WIDTH=3PERFORMANCE_TRACKING=falseMAX_LOG_FILE_SIZE=209715200## Throw log files away after 2097152 2MB / 209715200 200MB / 4398046511104 1GB*INFO:LOG_FLUSH_THRESHOLD=10FILENAME="log/game_server_info_%datetime{%Y%M%d%H}.log"ENABLED=true*DEBUG:FILENAME="log/game_server_debug_%datetime{%Y%M%d%H}.log"ENABLED=true*WARNING:LOG_FLUSH_THRESHOLD=0FILENAME="log/game_server_warn_%datetime{%Y%M%d%H}.log"ENABLED=true*TRACE:*VERBOSE:FORMAT="%level-%vlevel | %datetime{%d/%M/%y}  | %msg"## Error logs*ERROR:LOG_FLUSH_THRESHOLD=0ENABLED=trueFILENAME="log/game_server_error_%datetime{%Y%M%d%H}.log"*FATAL:LOG_FLUSH_THRESHOLD=0ENABLED=trueFILENAME="log/game_server_fatal_%datetime{%Y%M%d%H}.log"

生成出來的log非常整齊,整體滿足了我的需求,而且只有標頭檔案,不需要編譯庫,實在是方便。