在做服务器程序的过程中我想最有用的调试手段应该是日志系统了,好的日志能够直观快速的定位程序的问题,如系统崩溃,死锁,错误的异常抛出等。如何选择一个好的日志库对程序员来说至关重要。设计简陋粗糙的日志系统,可能会到导致系统的性能随着日志的增加而线性的降低,还可能导致线程安全型等问题,我在项目中用到了log4cplus这个日志库,log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的。log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统.受Apache Software License保护。作者是Tad E. Smith。log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将信息划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期; 你可以选择将信息输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。
Log4cplus在Linux下的安装:
1. 配置 ./ configure--prefix=/usr
2. 编译 make
3. 安装 make intsall
--prefix 是指定安装目录,Linux默认会从/usr/include下寻找头文件,在/usr/lib目录寻找库文件。
Log4cplus移植到ARM:
首先你需要安装并导出一个交叉编译环境,然后查看你的交叉编译环境默认的库的安装目录,在终端输入命令:echo 'main(){}'|arm-none-linux-gnueabi-gcc -E -v –
查看默认的安装目录。
1. 配置sudo ./configure --prefix=yourinstall path --host=arm-linux
2. 修改Makefile将Makefile中的所有的与编译相关的编译链工具都改成交叉编译工具,这其中包括:ar ,as ,ld ,gcc ,g++,rannlib
3. 编译 make
4. 安装 make install
Log4Cplus的使用基本步骤:
1. 实现了一个封装了输出介质的appender对象
2. 实例化一个封装了输出格式的Layout对象
3. 将Layout对象绑定(attach)到appender
4. 获得Logger对象
5. 将append绑定到Logger
6. 设置Logger的日志等级
7. 打印日志
例子程序:
#include <iostream>
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <iomanip>
#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/layout.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
using namespace log4cplus;
using namespace std;
int main()
{
SharedAppenderPtr appendPtr(new RollingFileAppender("log_text.txt",1*1024*1024,1,true));
Logger logger = Logger::getInstance("test");
std::string pattern = "%p-%d{%y/%m/%d %H:%M:%S-%Q}{ThreadID:%t} ->%m\r\n";
std::auto_ptr<Layout> layout_(new PatternLayout(pattern));
appendPtr->setLayout(layout_);
logger.addAppender(appendPtr);
logger.setLogLevel(ALL_LOG_LEVEL);
LOG4CPLUS_INFO(logger,"Info message");
LOG4CPLUS_DEBUG(logger,"Debug message");
LOG4CPLUS_TRACE(logger,"Trace message");
LOG4CPLUS_ERROR(logger,"Error message");
LOG4CPLUS_WARN(logger,"Warning message");
LOG4CPLUS_FATAL(logger,"fatal message");
return 0;
}
这是一个简单的例子,更为具体的使用方式可以去查阅更详细的资料:如:http://wenku.baidu.com/view/51d96c1d964bcf84b9d57b9c.html
Log4cplus日志库的有点很明显,不会随着日志数量的增加而增加系统的负担,而且不用担心线程安全等其他的问题