天天看點

我個人的apache log4cxx v0.10.0的編譯與測試使用

1、個人環境:CentOS 7.3,gcc 4.8.5

下載下傳安裝包,apache-log4cxx-0.10.0.tar.gz

截止到2011年8月9日,最新版本是0.10.0,可見這個庫不怎麼更新了。

2、安裝之前需要修改源碼,否則編譯出錯

(1)vim src/main/cpp/inputstreamreader.cpp

增加#include <string.h>;

#include <log4cxx/logstring.h>

#include <log4cxx/helpers/inputstreamreader.h>

#include <log4cxx/helpers/exception.h>

#include <log4cxx/helpers/pool.h>

#include <log4cxx/helpers/bytebuffer.h>

+

#include <string.h>  //--23行

否則會出現inputstreamreader.cpp:66: error: 'memmove' was not declared in this scope

make[3]: *** [inputstreamreader.lo] 錯誤 1

(2)vim src/main/cpp/socketoutputstream.cpp

#include <log4cxx/logstring.h>  

#include <log4cxx/helpers/socketoutputstream.h>  

#include <log4cxx/helpers/socket.h>  

#include <log4cxx/helpers/bytebuffer.h>  

+  

#include <string.h> //--22行

否則會出現socketoutputstream.cpp:52: error: 'memcpy' was not declared in this scope

(3)vim src/examples/cpp/console.cpp

#include <string.h> //--18行

#include <stdio.h>

#include <stdlib.h>

#include <log4cxx/logger.h>

#include <log4cxx/consoleappender.h>

#include <log4cxx/simplelayout.h>

#include <log4cxx/logmanager.h>

#include <iostream>

#include <locale.h>

否則會出現

console.cpp: In function ‘int main(int, char**)’:

console.cpp:58: 錯誤:‘puts’在此作用域中尚未聲明

3、編譯安裝

$ cd apache-log4cxx-0.10.0

$ ./configure

$ make

$ make check

$ sudo make install

預設的安裝完的頭檔案和庫檔案路徑分别是:

/usr/local/include/log4cxx

/usr/local/lib

我看網上别人寫的文章都說log4cxx編譯前需要安裝apr和apr-util依賴庫。但是我沒有安裝,也編譯成功了,奇怪?

别人是這樣寫的:

首先安裝apr-1.4.6,切換cd apr-1.4.6,配置./configure --prefix=/usr/local/apr,接着make, make install

接着安裝apr-util-1.4.1,切換至cd ../apr-util-1.4.1, ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr,接着make,make install;

最後安裝apache-log4cxx-0.10.0,切換cd ../apache-log4cxx-0.10.0,配置./configure --prefix=/usr/local/log4cxx --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

4、執行個體

代碼:(如果CentOS是英文版,記錄日志應該會出現中文亂碼的情況。)

#include <log4cxx/logger.h>    

#include <log4cxx/propertyconfigurator.h>

int main(int argc, char* argv[])

{

       using namespace log4cxx;

       // 讀取配置檔案

       PropertyConfigurator::configure("conf.log");

       // 建立兩個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;

}

配置檔案conf.log的内容

log4j.rootLogger=TRACE, stdout, logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

log4j.appender.logfile=org.apache.log4j.RollingFileAppender

log4j.appender.logfile.File=./ZW.log

log4j.appender.logfile.MaxFileSize=100KB

log4j.appender.logfile.MaxBackupIndex=10

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern=%d [%t] %-5p %c - %m%

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(mylog4cxxTest)

add_executable(${PROJECT_NAME} "main.cpp")

TARGET_LINK_LIBRARIES(${PROJECT_NAME} log4cxx)

編譯通過,但是運作時會報錯:error while loading shared libraries: liblog4cxx.so.10: cannot open shared object file: No such file or directory

此時需要在/etc/ld.so.conf中加入liblog4cxx.so所在的目錄:/usr/local/lib/

然後在終端執行指令,使之生效:

[root@localhost etc]# ldconfig

注意,/usr/local/lib/每次有庫檔案更新,都需要終端重新運作一次ldconfig這條指令。

或者運作時記得

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

---

參考文章:

http://blog.51cto.com/yaocoder/980276 http://blog.sina.com.cn/s/blog_a459dcf501013mr1.html

 C++日志系統log4cxx使用總結

一、log4cxx命名規則

       Logger由一個String類的名字識别,logger的名字是大小寫敏感的,且名字之間具有繼承的關系,子名 有父名作為字首,用點号.分隔。如:x.y是x.y.z的父親。根logger (root logger)是所有logger的祖先,  它具有如下屬性:1) 它總是存在的;2) 它不可以通過名字獲得。 通過調用public static Logger Logger.getRootLogger()獲得root logger;通過調用public static  Logger Logger.getLogger(String name)或者public static Logger Logger.getLogger(Class clazz)獲得 或者建立)一個named logger。後者相當于調用Logger.getLogger(clazz.getName())。 在某對象中,用該對象所屬的類為參數,調用Logger.getLogger(Class clazz)以獲得logger被認為是目前  所知的最理智的命名logger的方法。

二、log4cxx Log Level級别介紹

    每個logger都被配置設定了一個日志級别 (log level),用來控制日志資訊的輸出。未被配置設定level的  logger将繼承它最近的父logger的level。每條輸出到logger的日志請求(logging request)也都有一個  level,如果該request的level大于等于該logger的level,則該request将被處理(稱為enabled);否則該  request将被忽略。故可得知:1、logger的level越低,表示該logger越詳細 2、logging request的  level越高,表示該logging request越優先輸出 3、如果沒有設定日志記錄器(Logger)的級别,那麼它将  會繼承最近的祖先的級别。是以,如果在包com.foo.bar中建立一個日志記錄器(Logger)并且沒有設定級  别,那它将會繼承在包com.foo中建立的日志記錄器(Logger)的級别。如果在com.foo中沒有建立日志記錄  器(Logger)的話,那麼在com.foo.bar中建立的日志記錄器(Logger)将繼承root 日志記錄器(Logger)  的級别,root日志記錄器(Logger)經常被執行個體化而可用,它的級别為DEBUG。

Level類中預定義了五個level,它們的大小關系如下:Level.ALL < Level.DEBUG < Level.INFO < Level.WARN < Level.ERROR < Level.FATAL < Level.OFF

三、log4cxx(log4j) Log layout介紹

org.apache.log4j.HTMLLayout(以HTML表格形式布局),

org.apache.log4j.PatternLayout(可以靈活地指定布局模式),

org.apache.log4j.SimpleLayout(包含日志資訊的級别和資訊字元串),

org.apache.log4j.TTCCLayout(包含日志産生的時間、線程、類别等等資訊)

四、log4cxx Log 格式化資訊介紹

Log4J采用類似C語言中的printf函數的列印格式格式化日志資訊,列印參數如下:

%m 輸出代碼中指定的消息

%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL

%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數

%c 輸出所屬的類目,通常就是所在類的全名

%t 輸出産生該日志事件的線程名

%n 輸出一個回車換行符,Windows平台為“rn”,Unix平台為“n”

%d 輸出日志時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyyy MMM dd

HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921 %l 輸出日志事件的發生位置,包括類目名

、發生的線程,以及在代碼中的行數。

五、log4cxx Log appender種類介紹

Log4cXX提供的appender種類:

org.apache.log4j.ConsoleAppender 控制台

org.apache.log4j.DailyRollingFileAppender 每天産生一個日志檔案

org.apache.log4j.FileAppender 檔案org.apache.log4j.RollingFileAppender 檔案大小達到指定尺寸的

時候産生一個新的檔案

六、log4cxx Log Filter介紹

包括選擇過濾器和設定過濾條件,可選擇的過濾器包括:LogLevelMatchFilter、LogLevelRangeFilter、和  StringMatchFilter:

1、對LogLevelMatchFilter來說,過濾條件包括LogLevelToMatch和AcceptOnMatch(true|false), 隻有  當log資訊的LogLevel值與LogLevelToMatch相同,且AcceptOnMatch為true時才會比對。

2、對LogLevelRangeFilter來說,過濾條件包括LogLevelMin、LogLevelMax和AcceptOnMatch,隻有當log信  息的LogLevel在LogLevelMin、LogLevelMax之間同時AcceptOnMatch為true時才會比對。

3、對StringMatchFilter來說,過濾條件包括StringToMatch和AcceptOnMatch,隻有當log資訊的LogLevel  值與StringToMatch對應的LogLevel值與相同, 且AcceptOnMatch為true時會比對。

七、log4cxx additivity屬性介紹

它是 子Logger 是否繼承 父Logger 的 輸出源(appender) 的标志位。 具體說,預設情況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender裡輸  出。 若是additivity設為false,則子Logger隻會在自己的appender裡輸出,而不會在父Logger的appender裡輸  出。

八、log4cxx中XML檔案範例

請參考:

http://blog.sina.com.cn/s/blog_a459dcf501013vh1.html

九、log4cxx編譯

 請參考:

http://blog.sina.com.cn/s/blog_a459dcf501013tbn.html