我的英文博客参考:http://csfreebird.blogspot.com/2013/12/use-boost-log-step1.html
我过去习惯使用cppcms提供的日志库,简单好用。从1.54版本,Boost发布了日志库。当读了一些文档后,因为下面的一些原因,我决定转而使用boost::log。
1. TCP服务大概连接了2000个设备,TCP server会保存所有详细信息。举个例子,设备登录到TCP server,设备退出,设备发出消息,server发出消息。并且设备的数量在将来还会增长。这些导致会创建一些很大的日志文件。
2. 需要分析日志文件从而诊断TCP server的故障。也需要观察我们的客户是如何使用他们的设备。当有故障发生时,管理员要收到邮件通知。产品相关人员能够在网站上看到用户行为分析报告以帮助他们改进产品。
很显然,boost的新的log库为上述目的而设计的。正是我期待的。
这里有一个例子,绝大多数代码来自于boost log 文档:http://www.boost.org/doc/libs/1_55_0/libs/log/doc/html/log/tutorial.html#log.tutorial.trivial
我使用Ubuntu 13.10, 安装了clang 3.4,boost1.55是我用clang和 c++ 11选项编译的。参考我的编译命令如下:
./bootstrap.sh --with-libraries=system,filesystem,log,thread --with-toolset=clang ./b2 toolset=clang cxxflags="-std=c++11"
好,现在创建一个main.cc文件,然后写下代码如下:
#include <iostream> #include <boost/log/trivial.hpp> using namespace std; int main () { cout << "hello, world" << endl; BOOST_LOG_TRIVIAL(trace) << "A trace severity message"; BOOST_LOG_TRIVIAL(debug) << "A debug severity message"; BOOST_LOG_TRIVIAL(info) << "An informational severity message"; BOOST_LOG_TRIVIAL(warning) << "A warning severity message"; BOOST_LOG_TRIVIAL(error) << "An error severity message"; BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message"; }
执行编译和链接命令:
c++ -g -std=c++11 -Wall -DBOOST_LOG_DYN_LINK -o ./main.o -c ./main.cc c++ -g -std=c++11 ./main.o -o main -rdynamic -lpthread -lboost_log -lboost_system -lboost_thread -lboost_filesystem
现在运行程序./main,输出结果如下:
$ ./main hello, world [2013-12-03 14:35:14.309093] [0x000007f362c17d74] [trace] A trace severity message [2013-12-03 14:35:14.309208] [0x000007f362c17d74] [debug] A debug severity message [2013-12-03 14:35:14.309224] [0x000007f362c17d74] [info] An informational severity message [2013-12-03 14:35:14.309237] [0x000007f362c17d74] [warning] A warning severity message [2013-12-03 14:35:14.309250] [0x000007f362c17d74] [error] An error severity message [2013-12-03 14:35:14.309262] [0x000007f362c17d74] [fatal] A fatal severity message
默认情况系,BOOST_LOG_TRIVIAL输出所有信息到控制台。有些人遇到了这个问题:
undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'
编译时添加一个宏即可解决。
-DBOOST_LOG_DYN_LINK