log4cplus在Linux下編譯及使用


log4cplus第一次在windows下使用的時候很快就完成了,最近在Linux下嘗試使用時遇到了不少問題,主要原因是對Linux的編譯連接不熟悉,以下就記錄安裝使用的過程,希望對需要的人有所幫助。

1.下載並解壓log4cplus_1.2.1可以在網上下載log4cplus_1.2.1,下載完成后解壓,注意,解壓后在 log4cplus_1.2.1 目錄下應該有 configure 文件。

2.安裝

在 log4cplus_1.2.1 目錄下依次執行如下命令

#### 有問題的命令 ./configure --prefix=/usr/local/   網上介紹的大多是如此寫法,雖然能編譯通過,但是會有一些問題,詳見第 5 節

./configure --prefix=/usr/local/ --enable-static CXXFLAGS="-std=c++0x"

make

make install

其中 --prefix 指明了安裝目錄,--enable-static 指明了要生成靜態庫(可以不包含,這樣就不會生成 .a 文件), CXXFLAGS="-std=c++0x" 指明了使用c++11(注意兼容性,如果編譯庫用了c++11,則引用該庫時必須使用c++11)如果安裝成功,則在 /usr/local/lib 目錄下有 liblog4cplus-1.2.so.5、liblog4cplus-1.2.so.5.1.6、liblog4cplus.la、liblog4cplus.so 文件(.so是動態鏈接庫的靜態庫,.so.5是動態鏈接庫,相當於windows下的.dll,liblog4cplus.a 是靜態庫,添加--enable-static 后會生成,默認只生成動態庫),還有一個文件夾 pkgconfig 只包含了 一個log4cplus.pc 文件,該文件記錄了安裝目錄、版本號等基本信息。在/usr/local/下有 include 文件,其中的 log4cplus 文件夾就包含了該庫依賴的頭文件。

 

 error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

3.編譯測試demo

測試需要四個文件,是 MyLogger.h , main.cpp ,  logconfig.property , CMakeLists.txt (用cmake編譯時可用) ,文件內容如下,放入同一個文件夾進行編譯

MyLogger.h

#include <log4cplus/logger.h>
#include <log4cplus/configurator.h> 
#include <log4cplus/layout.h> 
#include <log4cplus/loggingmacros.h> 
#include <log4cplus/helpers/stringhelper.h> 

#define MY_LOG_FILE_PATH "logconfig.property"

class MyLogger
{
private:
    MyLogger()
    {
        log4cplus::initialize();
        log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH));
        
        m_rootLog = log4cplus::Logger::getRoot();

        m_loggerYW = log4cplus::Logger::getInstance("loggerYW");
        m_loggerWJ = log4cplus::Logger::getInstance("loggerWJ");
        m_loggerUI = log4cplus::Logger::getInstance("loggerUI");     
    }
    ~MyLogger()
    {
        if (m_logger)
        {
            delete m_logger;
        }
    }


    static MyLogger* m_logger;

public:
    static MyLogger * getInstance()
    {
        if (m_logger == NULL)
        {
            m_logger = new MyLogger();
        }
        return m_logger;
        }

    log4cplus::Logger m_rootLog;
    
    log4cplus::Logger m_loggerYW;
    log4cplus::Logger m_loggerWJ;
    log4cplus::Logger m_loggerUI;

};

MyLogger* MyLogger::m_logger = NULL;

main.cpp

#include "MyLogger.h"

int main(int argc, char *argv[])
{
    MyLogger * myLoger = NULL;
    myLoger = MyLogger::getInstance();

    LOG4CPLUS_FATAL(myLoger->m_loggerYW, "DeleteService failed,errCode=[" << 2 << "]");
    LOG4CPLUS_DEBUG(myLoger->m_loggerWJ, " Service is removed");
    LOG4CPLUS_DEBUG(myLoger->m_loggerUI, " Service ");
    
    return 0;
}

logconfig.property

log4cplus.rootLogger=DEBUG,rootLogger
log4cplus.appender.rootLogger=log4cplus::RollingFileAppender  
#log4cplus.appender.rootLogger=log4cplus::ConsoleAppender
log4cplus.appender.rootLogger.MaxFileSize=100MB
log4cplus.appender.rootLogger.MaxBackupIndex=2
log4cplus.appender.rootLogger.File=rootLogger.log
log4cplus.appender.rootLogger.layout=log4cplus::PatternLayout
log4cplus.appender.rootLogger.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.rootLogger.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.rootLogger.filters.1.LogLevelMin=TRACE
log4cplus.appender.rootLogger.filters.1.LogLevelMax=FATAL
log4cplus.appender.rootLogger.filters.1.AcceptOnMatch=true
log4cplus.appender.rootLogger.filters.2=log4cplus::spi::DenyAllFilter
  
log4cplus.logger.loggerYW=DEBUG,loggerYW
log4cplus.appender.loggerYW=log4cplus::RollingFileAppender
log4cplus.appender.loggerYW.File=loggerYW.log
log4cplus.appender.loggerYW.layout=log4cplus::PatternLayout
log4cplus.appender.loggerYW.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.loggerYW.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.loggerYW.filters.1.LogLevelMin=TRACE
log4cplus.appender.loggerYW.filters.1.LogLevelMax=FATAL
log4cplus.appender.loggerYW.filters.1.AcceptOnMatch=true
log4cplus.appender.loggerYW.filters.2=log4cplus::spi::DenyAllFilter
log4cplus.appender.loggerYW.MaxFileSize=100MB
log4cplus.appender.loggerYW.MaxBackupIndex=2
log4cplus.additivity.loggerYW=false

log4cplus.logger.loggerWJ=DEBUG,loggerWJ
log4cplus.appender.loggerWJ=log4cplus::RollingFileAppender
log4cplus.appender.loggerWJ.File=loggerWJ.log
log4cplus.appender.loggerWJ.layout=log4cplus::PatternLayout
log4cplus.appender.loggerWJ.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.loggerWJ.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.loggerWJ.filters.1.LogLevelMin=TRACE
log4cplus.appender.loggerWJ.filters.1.LogLevelMax=FATAL
log4cplus.appender.loggerWJ.filters.1.AcceptOnMatch=true
log4cplus.appender.loggerWJ.filters.2=log4cplus::spi::DenyAllFilter
log4cplus.appender.loggerWJ.MaxFileSize=100MB
log4cplus.appender.loggerWJ.MaxBackupIndex=2
log4cplus.additivity.loggerWJ=false

log4cplus.logger.loggerUI=DEBUG,loggerUI
log4cplus.appender.loggerUI=log4cplus::RollingFileAppender
log4cplus.appender.loggerUI.File=loggerUI.log
log4cplus.appender.loggerUI.layout=log4cplus::PatternLayout
log4cplus.appender.loggerUI.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.loggerUI.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.loggerUI.filters.1.LogLevelMin=TRACE
log4cplus.appender.loggerUI.filters.1.LogLevelMax=FATAL
log4cplus.appender.loggerUI.filters.1.AcceptOnMatch=true
log4cplus.appender.loggerUI.filters.2=log4cplus::spi::DenyAllFilter
log4cplus.appender.loggerUI.MaxFileSize=100MB
log4cplus.appender.loggerUI.MaxBackupIndex=2
log4cplus.additivity.loggerUI=false

 CMakeLists.txt

# CMake 最低版本號要求
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 項目名
PROJECT(LOG)

# 添加第三方的庫
SET(INC_DIR "/usr/local/include/")
SET(LINK_DIR "/usr/local/lib")

INCLUDE_DIRECTORIES(${INC_DIR})    # 設置頭文件搜索路徑
LINK_DIRECTORIES(${LINK_DIR})    #指定要鏈接的庫文件的路徑,一般不需要
# 將第三方的庫鏈接到可執行文件,靜態鏈接
LINK_LIBRARIES(log4cplus)

# 指定源文件
SET(SRC_LIST "main.cpp")
MESSAGE(STATUS "SRC_LIST :" ${SRC_LIST})

# 指定生成目標
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST})

# 將第三方的庫鏈接到可執行文件,動態鏈接
#TARGET_LINK_LIBRARIES(${PROJECT_NAME} log4cplus)

# 安裝目標文件
SET(PROJECT_INSTALL_PREFIX "/mnt/hgfs/VM_Shared/Teselog4cplus/build/dd")
#INSTALL(TARGETS ${PROJECT_NAME}
#        DESTINATION ${PROJECT_INSTALL_PREFIX}
#         PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)

# 安裝配置文件
SET(CONFIG_INSTALL_PREFIX "/mnt/hgfs/VM_Shared/Teselog4cplus/build")        
INSTALL(FILES logconfig.property
        DESTINATION ${CONFIG_INSTALL_PREFIX})

 

直接編譯命令(可用cmake編譯安裝):g++ main.cpp -I /usr/local/include/ -L /usr/local/lib -l log4cplus -o main
注意這里使用的是g++,我剛開始使用的是 gcc ,結果無法編譯,原因見(https://blog.csdn.net/u013457167/article/details/80222557),如果是多線程,好像還有其他注意事項,有興趣可以搜索相關內容。

4.測試效果

輸入以下命令

./main

如果提示不能打開 liblog4cplus-1.2.so.5 文件,則參考 https://www.cnblogs.com/liyubo/p/10528855.html ,

問題解決后,在當前目錄下會有日志文件產生 log.log

==============================================================================================

5.其他注意事項

異常錯誤

undefined reference to ‘log4cplus::Logger::operator=(log4cplus::Logger&&)

經過搜索發現,原來在編譯log4cplus的時候需要添加參數 CXXFLAGS="-std=c++0x",所以完整的命令應如下:

./configure --prefix=/usr/local/ CXXFLAGS="-std=c++0x"

 qt creator 項目中 .pro 文件鏈接庫的方法

unix{#表示Linux環境的特殊設置,這個大括號不能單獨放在下一行,否則編譯會報錯
#在Linux系統Qt開發,這句話不靈,編譯可通過,但是程序不可運行,提示找不到庫文件
#LIBS += ../bin/libCommunicate.so#包含項目需要用到的共享庫,注意文件名多了關鍵字"lib",擴展名是.so
#LIBS += -L /usr/local/lib -l log4cplus #加載動態庫
LIBS += /usr/local/lib/liblog4cplus.a}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM