简述
平时调试c++、c程序和记录一些程序打印信息时,使用的最多的就是printf,但是终端显示有限,而且不利于统计,所以想把开源的日志库加入到工程中;测试对比了一些日志库,发现log4cpp比较适合我们的工程。
1)可以自由控制日志在终端和日志中的输出,同时或只记录在文件;
2)有配置文件,只需修改配置文件即可达到功能适配;
3)日志排版多样化,可自己定制;
4)日志可以分标签或者按模块输出;
5)控制日志个数和大小,不用担心日志无限增多,导致空间不足;
在此记录我的编译和测试过程,方便以后其他工程可以直接使用。
编译
测试使用的是 log4cpp-1.1.3.tar.gz
交叉编译库配置,在pc上编译库,不用这么麻烦
./configure CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ --prefix=/home/xiangang/work/test/log4cpp/log4cpp/build --host=arm
make -j8
make install
这样在build目录下就可以生成4个目录
xiangang@xiangang:~/work/test/log4cpp/build$ ls
bin include lib share
xiangang@xiangang:~/work/test/log4cpp/build/lib$ ls
liblog4cpp.a liblog4cpp.la pkgconfig
其中liblog4cpp.a就是我们所需要的静态库,头文件在include下面。
测试
在pc上测试
CMakeLists.txt
project(test)
#添加C++11支持
add_definitions(-std=c++11)
#添加头文件搜索路径
include_directories(/usr/local/include)
#添加库文件搜索路径
link_directories(/usr/local/lib)
#用于将当前目录下的所有源文件的名字保存在变量 DIR_SRCS 中
aux_source_directory(. DIR_SRCS)
add_executable(test ${DIR_SRCS})
#在这里根据名字log4cpp寻找文件
target_link_libraries(test log4cpp pthread)
Clog4Util.h
#ifndef CLOG4UTIL_INCLUDE
#define CLOG4UTIL_INCLUDE
#include "log4cpp/Category.hh"
#include "log4cpp/Appender.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/OstreamAppender.hh"
#include "log4cpp/Layout.hh"
#include "log4cpp/BasicLayout.hh"
#include "log4cpp/Priority.hh"
#include "log4cpp/PropertyConfigurator.hh"
#include <iostream>
#include <string>
using namespace std;
#define Debug(tag, ...) {log4cpp::Category& t_debug = log4cpp::Category::getInstance(tag); \
t_debug.debug( __VA_ARGS__ );}
#define Info(tag, ...) {log4cpp::Category& t_debug = log4cpp::Category::getInstance(tag); \
t_debug.info( __VA_ARGS__ );}
#endif
在同文件中,宏定义了debug和info,只是演示,后续我会定义更多的功能。
Clog4Util.cpp
#include "Clog4Util.h"
int Init(string initfilename) {
try {
log4cpp::PropertyConfigurator::configure(initfilename);
}
catch (log4cpp::ConfigureFailure&f) {
std::cout << "Configure Problem " << f.what() << std::endl;//失败
return -1;
}
return 0;
}
这个init函数是为了加载配置文件。
main.cpp
#include <stdio.h>
#include <ctype.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <thread>
#include <time.h>
#include "Clog4Util.h"
int main(int argc, char *argv[])
{
if(argc < 2){
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
Init(argv[1]);
int count = 0;
while(1)
{
count++;
if(count > 2048)
{
break;
}
debug("mytest %s %d %x", "asdfaf", 1, 0x58);
}
return 0;
}
配置文件 log4cpp.conf
#-------定义rootCategory的属性-------
#指定rootCategory的log优先级是ERROR,其Appenders有两个,分别是console,TESTAppender
#log4cpp.rootCategory=DEBUG, console, TESTAppender
log4cpp.rootCategory=DEBUG, TESTAppender
#-------定义console属性-------
#consoleAppender类型:控制台输出
#下面这三条语句表示控制台输出的log输出的布局按照指定的格式;输出格式是:[%p] %d{%H:%M:%S.%l} (%c): %m%n
log4cpp.appender.console=ConsoleAppender
log4cpp.appender.console.layout=PatternLayout
#log4cpp.appender.console.layout.ConversionPattern=[%p] %d{%H:%M:%S} (%c)
log4cpp.appender.console.layout.ConversionPattern=[%p] %d{%H:%M:%S.%l} (%c): %m%n
#-------定义TESTAppender的属性-------
#RollingFileAppender类型:输出到回卷文件,即文件到达某个大小的时候产生一个新的文件
#下面的语句表示文件输出到指定的log文件,输出的布局按照指定的格式,输出的格式是:[%d{%Y-%m-%d %H:%M:%S.%l} - %p] (%c): %m%n
log4cpp.appender.TESTAppender=RollingFileAppender
#当日志文件到达maxFileSize大小时,将会自动滚动 1024 = 1k
log4cpp.appender.TESTAppender.maxFileSize=1024000
#maxBackupIndex指定可以产生的滚动文件的最大数
log4cpp.appender.TESTAppender.maxBackupIndex=5
#fileName指定信息输出到logs/irismatch.log文件
log4cpp.appender.TESTAppender.fileName=/home/xiangang/work/test/log4cpp/test/build/log.log
#PatternLayout 表示可以灵活指定布局模式
log4cpp.appender.TESTAppender.layout=PatternLayout
#append=true 信息追加到上面指定的日志文件中,false表示将信息覆盖指定文件内容
log4cpp.appender.TESTAppender.append=true
log4cpp.appender.TESTAppender.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S} - %p] (%c):%m%n
#log4cpp.appender.TESTAppender.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S.%l} - %p] (%c): %m%n
编译好后:./test log4cpp.conf 运行,即可看见log.log日志文件了。多次运行程序,日志会累加,当一个文件大小达到1024k时,会自动备份记录到新文件中,备份数量达到4个时,会进行覆盖。当然这是按我配置文件来的。