用什么在C++程序里面写日志?一直在等待boost发布真正的日志库,就是不见踪影。以前用的log4cxx也太老了。在使用CppCMS的时候,发现了Artyom开发的booster::log,用法简单,值得推荐。
编译CppCMS的方法请看我以前的博客。
然后在你的C++代码中这样写:
#include <booster/log.h> #include <booster/shared_ptr.h> /* * */ int main(int argc, char** argv) { booster::shared_ptr<booster::log::sinks::file> f(new booster::log::sinks::file()); f->append(); f->max_files(10); f->open("/opt/test.log"); booster::log::logger::instance().add_sink(f); booster::log::logger::instance().set_default_level(booster::log::notice); return 0; }
max_files是什么意思?指的是最多生成10个日志文件,每次调用f->open的时候,就会产生一个新的test.log文件,而把旧的文件重命名,比如叫做test.log.1
注意max_files调用需要在open之前,否则无效,因为实现代码如下:cppcms1.0.2/booster/log/src/log.cpp
void file::max_files(unsigned m) { if(!opened_) max_files_=m; }
目前旋转日志不支持按照文件大小自动切分,不过看了里面的代码,有max_size和current_size变量,Artyom日后应该会增加这个功能。
所有的日志处理类都继承自booster::sink类,你可以实现自己的处理类,然后调用add_sink就可以接手日志消息。
参考文档见:http://cppcms.com/cppcms_ref/latest/namespacebooster_1_1log.html#details
看看如何写日志吧。
BOOSTER_ERROR("main") << "The configuration file path specified by paramerter doens't exit,file path:" << xml_path;宏BOOSTER_ERROR可以输出日志。_ERROR代表日志级别,低于默认级别的不会出现在日志文件中。
enum level_type { emergency = 0, alert = 10, critical = 20, error = 30, warning = 40, notice = 50, info = 60, debug = 70, all = 100 }在前面的日志级别高,越往后越低。
#define BOOSTER_LOG(level,module) \ ::booster::log::logger::instance().should_be_logged(::booster::log::level,module) \ && ::booster::log::message(::booster::log::level,module,__FILE__,__LINE__).out() /// Same as BOOSTER_LOG(emergency,m) #define BOOSTER_EMERG(m) BOOSTER_LOG(emergency,m) /// Same as BOOSTER_LOG(alert,m) #define BOOSTER_ALERT(m) BOOSTER_LOG(alert,m) /// Same as BOOSTER_LOG(critical,m) #define BOOSTER_CRITICAL(m) BOOSTER_LOG(critical,m) /// Same as BOOSTER_LOG(error,m) #define BOOSTER_ERROR(m) BOOSTER_LOG(error,m) /// Same as BOOSTER_LOG(warning,m) #define BOOSTER_WARNING(m) BOOSTER_LOG(warning,m) /// Same as BOOSTER_LOG(notice,m) #define BOOSTER_NOTICE(m) BOOSTER_LOG(notice,m) /// Same as BOOSTER_LOG(info,m) #define BOOSTER_INFO(m) BOOSTER_LOG(info,m) /// Same as BOOSTER_LOG(debug,m) #define BOOSTER_DEBUG(m) BOOSTER_LOG(debug,m)