宿主機環境: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 拷貝到板子上
運行