宿主机环境:Ubuntu 12.04 64bit
ARM平台交叉编译工具链:arm-hisiv600-linux-
下载目前最新版 log4cpp,目前是 log4cpp-1.1.3.tar.gz
https://sourceforge.net/projects/log4cpp/
解压该压缩包到任意一个目录
tar -xzf log4cpp-1.1.3.tar.gz
同时新建一个目录用来装编译生成的头文件和库文件(如果不想默认装在 /usr/local 路径的话)
mkdir xxx
安装说明和示例代码可以参考:log4cpp/doc/html/index.html
Ubuntu宿主机配置安装
cd log4cpp
./configure --prefix=/home/admin/xxx
make
make install
这时去到 xxx 目录下,会看到有 include 和 lib 目录生成
cd xxx
新建一个 cpp 文件
touch log_test.cpp
// log_test.cpp
#include <log4cpp/Category.hh>
#include <log4cpp/PropertyConfigurator.hh>
int main(int argc, char* argv[])
{
std::string initFileName = "log4cpp.properties";
log4cpp::PropertyConfigurator::configure(initFileName);
log4cpp::Category& root = log4cpp::Category::getRoot();
log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
root.warn("Storm is coming");
sub1.debug("Received storm warning");
sub1.info("Closing all hatches");
sub1.info("All hatches closed");
root.info("Ready for storm.");
root.log(log4cpp::Priority::INFO, "log4cpp test log [%s:%u]", __FILE__, __LINE__);
sub1.log(log4cpp::Priority::ERROR, "[%s:%u] log4cpp test log", __FUNCTION__, __LINE__);
log4cpp::Category::shutdown();
return 0;
}
新建一个属性配置文件 log4cpp.properties,与 log_test.cpp 同在一级目录
touch log4cpp.properties
# log4cpp.properties
# 定义 rootCategory 的属性
# 指定 rootCategory 的 log 优先级是 DEBUG, 其 Appenders 有一个, 名字叫 rootAppender
log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.category.sub1=DEBUG, TestAppender
# 定义 rootAppender 的属性
# consoleAppender 是指控制台输出
# 布局按照指定的格式, PatternLayout 布局打印的 log 比较好看
# ConversionPattern 的参数含义:
# %d 输出日志时间点的日期或时间
# %p 优先级
# %m 输出 log 的具体信息
# %n 回车换行
log4cpp.appender.rootAppender=ConsoleAppender
log4cpp.appender.rootAppender.layout=PatternLayout
log4cpp.appender.rootAppender.layout.ConversionPattern=%d [%p] %m%n
# 定义 TestAppender 的属性
# RollingFileAppender 是指输出到回卷文件, 即文件达到某个大小的时候产生一个新的文件
# /tmp/TestAppender.log 输出到指定的 log 文件
# 当日志文件到达 maxFileSize 大小时,将会自动滚动
# maxBackupIndex 指定可以产生的滚动文件的最大数目
log4cpp.appender.TestAppender=RollingFileAppender
log4cpp.appender.TestAppender.fileName=/tmp/TestAppender.log
log4cpp.appender.TestAppender.maxFileSize=200
log4cpp.appender.TestAppender.maxBackupIndex=1
log4cpp.appender.TestAppender.layout=PatternLayout
log4cpp.appender.TestAppender.layout.ConversionPattern=%d [%p] %m%n
编译 log_test.cpp
g++ log_test.cpp -o log_test -I./include -L./lib -llog4cpp -lpthread
把 log4cpp 库文件路径导出一下
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/admin/xxx
运行示例程序,显示正常
./log_test
ARM交叉工具链配置安装
删除之前的 log4cpp 目录,重新解压一次
新建一个目录用来装编译生成的头文件和库文件
mkdir yyy
cd log4cpp
./configure CC=arm-hisiv600-linux-gcc CXX=arm-hisiv600-linux-g++ --host=arm-hisiv600-linux --prefix=/home/admin/yyy
make
make install
把上面的 log_test.cpp 拷贝到yyy目录,编译 log_test.cpp
arm-hisiv600-linux-g++ log_test.cpp -o log_test -I ./include -L ./lib -llog4cpp -lpthread
把以下文件拷贝到开发板或者使用 nfs 挂载(此处我是使用 nfs 挂载的方式)
可执行程序 log_test
配置文件 log4cpp.properties
库文件 liblog4cpp.so(软链接) + liblog4cpp.so.5(软链接) + liblog4cpp.so.5.0.6(本体)
把 log4cpp 库文件路径导出一下
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/nfsroot
运行示例程序,显示异常
./log_test
估计是字符串拼接的时候出了问题
解决办法:
删除之前的 log4cpp 目录,重新解压一次,并清空 yyy 目录
cd log4cpp
echo "ac_cv_func_snprintf=yes" > ./config.cache
./configure CC=arm-hisiv600-linux-gcc CXX=arm-hisiv600-linux-g++ --host=arm-hisiv600-linux --config-cache --prefix=/home/admin/yyy
make
make install
同样方法编译、在开发板运行,正常显示了
log4cpp 的用处多多,对程序员开发 简直爱不释手!
另外,如果不想log打印在终端,可以使用dup2丢到空洞文件/dev/null,代码如下:
int fd = -1;
if ((fd = open("/dev/null", O_RDWR, 0)) != -1)
{
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
close(fd);
}
在ARM平台,如果是log4c的话,要依赖于expat去解析xml配置文件
下载expat 2.0.1版本
https://sourceforge.net/projects/expat/files/expat/
解压并进到expat-2.0.1目录,执行
./configure CC=arm-hisiv600-linux-gcc --host=arm-hisiv600-linux --prefix=/home/admin/aaa
make
make install
得到expat的头文件和库文件
下载log4c 1.2.4版本
https://sourceforge.net/projects/log4c/files/log4c/1.2.4/log4c-1.2.4.tar.gz/download
解压并进到log4c-1.2.4目录,执行
./configure CC=arm-hisiv600-linux-gcc --host=arm-hisiv600-linux CFLAGS=-I/home/admin/aaa/include LDFLAGS=-L/home/admin/aaa/lib --prefix=/home/admin/bbb
或
./configure CC=arm-hisiv600-linux-gcc --host=arm-hisiv600-linux --with-expat-prefix=/home/admin/aaa --prefix=/home/admin/bbb
make
make install
得到log4c的头文件和库文件,其配置文件可参考:/home/admin/bbb/etc/log4crc.sample,经过改良如下
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE log4c SYSTEM "">
<log4c>
<config>
<bufsize>0</bufsize>
<debug level="0"/>
<nocleanup>0</nocleanup>
</config>
<!-- root category ========================================= -->
<category name="root" priority="debug" appender="stdout"/>
<category name="file" priority="debug" appender="mylog"/>
<!-- default appenders ===================================== -->
<appender name="stdout" type="stream" layout="basic"/>
<appender name="mylog" type="rollingfile" layout="dated" logdir="/var/tmpfs/" prefix="xxx.log" rollingpolicy="RollingPolicy"/>
<!-- default layouts ======================================= -->
<layout name="basic" type="basic"/>
<layout name="dated" type="dated"/>
<rollingpolicy name="RollingPolicy" type="sizewin" maxsize="20000" maxnum="3"/>
</log4c>
测试程序
#include <stdio.h>
#include "log4c.h"
int main(void)
{
int i = 10;
char *str = "log4c_test";
log4c_init();
log4c_load("/usr/local/etc/log4crc.sample");
log4c_category_t *root = log4c_category_get("root");
log4c_category_log(root, LOG4C_PRIORITY_DEBUG, "Hello World!");
log4c_category_log(root, LOG4C_PRIORITY_ERROR, "Hello God! %d %s", i, str);
log4c_category_t *file = log4c_category_get("file");
log4c_category_log(file, LOG4C_PRIORITY_DEBUG, "Hello World!");
log4c_category_log(file, LOG4C_PRIORITY_ERROR, "Hello God! %d %s", i, str);
log4c_reread();
log4c_fini();
return 0;
}
编译
arm-hisiv600-linux-gcc xxx.c -I ./bbb/include -L ./aaa/lib -lexpat -L ./bbb/lib -llog4c
记得把 libexpat.so liblog4c.so 拷贝到板子上
运行