1. 程式人生 > >(linux)ubuntu 16.04 安裝 log4cxx

(linux)ubuntu 16.04 安裝 log4cxx

 本人從事遊戲開發,需要大量日誌,目前採用了 開源日誌 log4j的c++版本。

中間遇到了很多莫名其妙的錯誤,記錄下來,給朋友做點鋪路石,少走點彎路。

環境:ubuntu 16.04 Server版 (其他Linux發行版大致相同) 依賴:apr、apr-util

因為log4cxx原始碼安裝 需要依賴 apr 和 apr-util

所以要先把依賴庫裝上。

1、先安裝apr

$>tar xvf apr-1.6.2.tar.gz  
$>cd apr-1.6.2  
$>./configure--prefix=/usr/local //指定apr安裝目錄
$>make  
$>make install
如果make的時候碰到報錯:cannot remove `libtoolT’: No such file or directory

修改makeifle檔案:將 $RM "$cfgfile" 註釋掉。或者安裝libtool庫,本人是註釋掉的。

重新make即可。


2、安裝apr-util

    $>tar xvf apr-util-1.6.0.tar.gz  
    $>cd apr-util-1.6.0  
    $>./configuer --prefix=/usr/local --with-apr=/usr/local  //設定apr-util安裝目錄 並且指定apr庫的目錄
    $>make  
    $>make install  
如果make的時候碰到報錯:xml/apr_xml.c:35:19: error: expat.h: No such file or directory
$>tar jxvf expat-2.2.4.tar.bz2
$>tar cd expat-2.2.4
$>tar./configure --prefix=/usr/local/
$>tarmake
$>tarmake install
重新make安裝即可。

3、安裝log4cxx
    $>tar xvf apache-log4cxx-0.10.0.tar.gz  
    $>cd apache-log4cxx-0.10.0  
    $>./configuer --prefix=/usr/local --with-apr=/usr/local --with-apr-util=/usr/local  --with-charset=utf-8 --with-logchar=utf-8  
    $>make  

如果make的時候碰到報錯:inputstreamreader.cpp:66: error: 'memmove' was not declared in this scope make[3]: ***[inputstreamreader.lo] 錯誤 1 

有幾個.cpp檔案缺少了一些引用標頭檔案,新增上去即可。

src/main/cpp/inputstreamreader.cpp新增#include <string.h>  
src/main/cpp/socketoutputstream.cpp新增#include <string.h>  
src/examples/cpp/console.cpp新增#include <string.h>;#include <stdio.h>;


重新make安裝即可。

到此,log4cxx就全部安裝完成了。

因為編譯成的是共享庫,最後還要設定下搜尋目錄,編輯~/.bashrc,新增下面兩行

LD_LIBRARY_PATH=/usr/local/lib

export LD_LIBRARY_PATH

最後寫個程式,測試下。

#include <log4cxx/logger.h>
#include <log4cxx/logstring.h>
#include <log4cxx/propertyconfigurator.h>

int main(int argc, char* argv[])
{
    using namespace log4cxx;

    // 讀取配置檔案
    PropertyConfigurator::configure("log4cxx.cfg");

    // 建立兩個logger
    LoggerPtr logger1 = Logger::getLogger("TraceYourMama");
    LoggerPtr logger2 = Logger::getLogger("Patch");

    LOG4CXX_TRACE(logger1, "跟蹤");
    LOG4CXX_WARN(logger1, "警告");
    LOG4CXX_DEBUG(logger1, "除錯");
    LOG4CXX_ASSERT(logger1, false, "斷言");
    LOG4CXX_FATAL(logger1, "致命");

    LOG4CXX_TRACE(logger2, "跟蹤");
    LOG4CXX_ERROR(logger2, "錯誤");
    return 0;
}

編譯連結

$g++ -o main main.cpp -llog4cxx  
這裡需要配置log4cxx配置檔案。

下面是一個最簡單的配置檔案:

log4j.rootLogger=debug, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=./hello.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%5p %c [%t] (%F:%L) - %m%n