在做服务器程序的过程中我想最有用的调试手段应该是日志系统了,好的日志能够直观快速的定位程序的问题,如系统崩溃,死锁,错误的异常抛出等。如何选择一个好的日志库对程序员来说至关重要。设计简陋粗糙的日志系统,可能会到导致系统的性能随着日志的增加而线性的降低,还可能导致线程安全型等问题,我在项目中用到了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日志库的有点很明显,不会随着日志数量的增加而增加系统的负担,而且不用担心线程安全等其他的问题
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐