booster log 库介绍

来源:互联网 发布:c语言稀疏矩阵的和 编辑:程序博客网 时间:2024/06/06 08:37

用什么在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;}


运行看一下,/opt/test.log日志产生了。

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 }
在前面的日志级别高,越往后越低。

宏的定义都在log.h文件中:

#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)

关于时区,最早默认为GMT+0,后来我在mailing list中提了意见,现在是更友好的本地时区为默认值,不过可以通过函数set_timezone设置你想要的时区。