交叉編譯ARM平臺的log4cpp、log4c,支持屬性配置

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

運行

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章