VS2015下Log4Cplus編譯及其使用

主題 概要
項目實踐 爲windows服務添加log4cplus日誌庫文件
編輯 時間
新建 20160625
序號 參考資料
1 https://sourceforge.net/p/log4cplus/wiki/Home/

項目背景

最近在做一個OpenCV處理圖片的程序,需要在windows下建個服務在後臺持續進行處理。項目雖小,五臟俱全。比如以前不太在意的日誌功能,也要自己解決。
我的理解,以及接觸中的項目,日誌都有下面的幾項功能:
1.能快速定位到文檔中的位置,具體要到文件名和行號;
2.能夠控制日誌的顯示級別,最好能夠在程序運行中動態控制,至少也能通過更改配置文件控制;
3.存儲控制功能,對於長期運行的系統,需要對日誌文件進行轉儲備份,大小超限後,需要能自動刪除。

自然的選到了Log4系列的Log4cplus系統,花費一天時間終於大功告成,下面及時記錄下踩過的坑,避免忘記。

我的環境:VS2015和x64平臺;

由於項目還要兼顧其他代碼,不能爲了log4cplus更換環境,只能讓log4cplus適應這個環境。開始沒注意,也沒經驗,導致折騰很久。

編譯安裝

從官網下載最新版本,
https://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.1.3/
目前的最新版本是log4cplus-1.2.0.7,有意思的是以前的版本1.1.3沒有一下就編譯通過。

解壓出來後,log4cplus-1.2.0.7目錄裏面有個msvc10目錄,是最順手的編譯平臺,用vs2010打開,裏面有很多項目。實際只要編譯log4cplus或就行log4cplusS。根據默認的屬性編譯,順利編譯成功。
這裏寫圖片描述
在Win32/bin.Debug目錄下多出三個庫文件:
log4cplusSD.lib,log4cplusD.lib和log4cplusD.dll。
這裏寫圖片描述
log4cplusD.lib和log4cplusD.dll兩個要結合使用,log4cplusSD.lib能做爲靜態庫單獨使用。

我直接使用log4cplusSD.lib靜態庫,把它和include下面的頭文件目錄拷到自己設定的三方庫位置,並配置好項目附加庫目錄屬性或者直接直接放在VS2015的系統庫裏面。

使用

網上有很多關於怎麼調用log4cplus的AIP例子,包括怎麼使用配置文件,下面進行了簡單的封裝,使能夠全局使用。

MyLogger.h:

#pragma once

#include <iostream>
#include <string>
#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 F:/Project/ComShao/PlateRE/PlateER/etc/logconfig.properites"

using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;

class MyLogger
{
public:
    static MyLogger * getInstance ();
    Logger logger;
private:
    MyLogger();
    ~MyLogger();
    static MyLogger * my_logger;    
};

MyLogger.cpp:

#include "../include/MyLogger.h"

MyLogger *MyLogger::my_logger = NULL;

MyLogger::MyLogger()
{       
    log4cplus::initialize();
    PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH));
    logger = Logger::getRoot(); 
}


MyLogger * MyLogger::getInstance()
{
    if (my_logger==NULL)
    {
        my_logger = new MyLogger();
    }   
    return my_logger;
}

MyLogger::~MyLogger()
{
    if (my_logger)
    {
        delete my_logger;
    }   
}

在其他地方按下面方式使用:

MyLogger * myLoger = NULL;
myLoger = MyLogger::getInstance();

LOG4CPLUS_FATAL(myLoger->logger, "DeleteService failed,errCode=[" << GetLastError() << "]");
LOG4CPLUS_DEBUG(myLoger->logger, " Service is removed");

配置文件logconfig.properties:

#設置日誌追加到文件尾
log4cplus.appender.APPNDER_FILE=log4cplus::RollingFileAppender  

#設置日誌文件大小
log4cplus.appender.APPNDER_FILE.MaxFileSize=100MB

#設置生成日誌最大個數
log4cplus.appender.APPNDER_FILE.MaxBackupIndex=2

#設置輸出日誌路徑
log4cplus.appender.APPNDER_FILE.File=F:\Project\ComShao\PlateRE\PlateER\log\PlateER.log
log4cplus.appender.APPNDER_FILE.layout=log4cplus::PatternLayout

#設置日誌打印格式
log4cplus.appender.APPNDER_FILE.layout.ConversionPattern=|%D:%d{%Q}|%p|%t|%l|%m|%n

#設置日誌級別範圍
log4cplus.appender.APPNDER_FILE.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.APPNDER_FILE.filters.1.LogLevelMin=TRACE
log4cplus.appender.APPNDER_FILE.filters.1.LogLevelMax=FATAL
log4cplus.appender.APPNDER_FILE.filters.1.AcceptOnMatch=true
log4cplus.appender.APPNDER_FILE.filters.2=log4cplus::spi::DenyAllFilter

log4cplus.rootLogger=DEBUG,APPNDER_FILE

這樣能夠生成最多2個日誌文件,每個最多100M大小。TRACE~FATAL各種級別的日誌都輸出到同一個目錄中,可以通過調整log4cplus.rootLogger=DEBUG,APPNDER_FILE中的DEBUG爲其它級別,進行日誌過濾。

陷阱

把log4cplus集成在我的項目裏面時,直接進行編譯,會報如下錯誤:
這裏寫圖片描述
是因爲原項目是按X64平臺編譯的,而log4cplus沒做更改,默認是win32。需把log4cplus改爲x64重新編譯。
這裏寫圖片描述

更改後,又報error LNK2038: 檢測到“_MSC_VER”的不匹配項: 值“1600”不匹配值“1900”錯誤。

這裏寫圖片描述

這是因爲VS2015與VS2010的工具集不匹配,參見MSDN對這個錯誤的描述:

Visual Studio 定義以下符號防止鏈接不兼容的代碼,這可能導致運行時錯誤或其他意外行爲:
_MSC_VER
指示用於構造應用程序或庫的 Visual C++ 編譯器的主版本號和次版本號。代碼編譯使用 Visual C++ 編譯器的一個版本,它與使用具有不同的主版本號和次版本號版本編譯的代碼不兼容。如果鏈接的庫與您使用的 Visual C++ 編譯器版本不兼容,您無法獲取或生成庫的兼容版本。可以使用編譯器早期版本生成項目,更改項目的 平臺工具集 屬性。
解決方法是更改項目的平臺工具集屬性,要麼把原項目的平臺工具集改爲v100,要麼以VS2015打開log4cplus,並更改平臺工具集爲v140,重新編譯。

這裏寫圖片描述

我以VS2015打開log4cplus重新編譯後,會產生很多無法解析的外部符號。

這裏寫圖片描述

找了好久,原來問題仍然是兼容性上。
log4cplus使用的字符集是“使用多字節字符集”,而項目裏面是“使用 Unicode 字符集”,需要在屬性頁-常規中更改爲“使用 Unicode 字符”後重新編譯。

這裏寫圖片描述

至此,終於把log4cplus加到了項目中,日誌效果:

這裏寫圖片描述

可以簡單的修改配置文件就能過濾日誌級別,而且可以根據需要,按日誌級別,把日誌輸出到不同的log中,而不是混在一起。也可以定義日誌文件保留的個數和大小。

log4cplus還有很多強大功能,這個功能已經完美的解決了我的需求,it’s work!有同樣需要的同學,只要修改下日誌路徑,根據需要的平臺進行編譯,相信也能快速使用的。

發佈了38 篇原創文章 · 獲贊 29 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章