log4cplus在VS項目中的使用


log4cplus是C++編寫的開源的日志系統,宣稱具有線程安全、靈活、以及多粒度控制的特點,通過將日志划分優先級使其可以面向程序調試、運行、測試、和維護等全生命周期。你可以選擇將日志輸出到屏幕、文件、甚至是遠程服務器;通過指定策略對日志進行定期備份等等(該段為引用其他文章)。

1.編譯log4cplus庫

在網上下載log4cplus庫(我下載了 log4cplus-1.2.1.zip) ,解壓后在 msvc10 目錄下由vs的工程 .sln文件,使用VS打開(我用vs2013),

打開和工程包含內容如上,其中log4cplus為動態庫工程,log4cplusS為動態庫工程,可以根據需要進行編譯(我測試了靜態庫動態庫都可以正常使用)。編譯完成后如下目錄會產生.lib、.dll文件(只有編譯動態庫時產生.dll)。

頭文件在 \log4cplus_1.2.1\include 目錄下 

接下來就可以在自己的工程中引用該庫了(關於引用動態庫靜態庫的方法此處不贅述,《dll、lib編譯與加載》中有描述)

 2.log4cplus的初級應用

配置文件 logconfig.property

配置文件1

#RootLogger配置格式:log4cplus.rootLogger=[LogLevel],appenderName1,appenderName2,...,如此處LogLevel為DEBUG,appenderName1為 rootLogger
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.test=DEBUG,test
log4cplus.appender.test=log4cplus::RollingFileAppender  
log4cplus.appender.test.File=test.log
log4cplus.appender.test.layout=log4cplus::PatternLayout
log4cplus.appender.test.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.test.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.test.filters.1.LogLevelMin=TRACE
log4cplus.appender.test.filters.1.LogLevelMax=FATAL
log4cplus.appender.test.filters.1.AcceptOnMatch=true
log4cplus.appender.test.filters.2=log4cplus::spi::DenyAllFilter
log4cplus.appender.test.MaxFileSize=100MB
log4cplus.appender.test.MaxBackupIndex=2

#如何防止自定義的logger和root重復寫入日志
log4cplus.additivity.test=false

test

#include <log4cplus/logger.h>
#include <log4cplus/configurator.h> 
#include <log4cplus/layout.h> 
#include <log4cplus/loggingmacros.h> 
#include <log4cplus/helpers/stringhelper.h> 
#pragma comment(lib, "..\\..\\log4cplus_1.2.1\\msvc10\\Win32\\bin.Debug\\log4cplusSD.lib")

#define MY_LOG_FILE_PATH "E:\\VS_test\\threads\\threads2\\logconfig.property"    //配置文件路徑

int main(int argc, char *argv[])
{
    log4cplus::initialize();    //初始化日志
    log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH));    //讀取配置文件
    log4cplus::Logger logger = log4cplus::Logger::getRoot();    //根記錄器始終被實例化並可用。它的名字是"root"

    LOG4CPLUS_FATAL(logger, "DeleteService failed,errCode=[" << 1 << "]");    //打印級別為FATAL的日志
    LOG4CPLUS_DEBUG(logger, " Service is removed");    //打印級別為DEBUG的日志

    system("pause");
    return 0;
}

結果

2019-03-05 23:27:49:841.235|FATAL|19336|e:\vs_test\threads\threads2\main.cpp:18|DeleteService failed,errCode=[1]|
2019-03-05 23:27:49:852.238|DEBUG|19336|e:\vs_test\threads\threads2\main.cpp:19| Service is removed|

 

 3.封裝一個簡單的類,配置文件用上文中的 配置文件1 (以下忘記在哪里復制的,如有侵權敬請聯系刪除)

 MyLogger.h

#ifndef Logger_H
#define Logger_H

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


#ifdef WIN32
#include <windows.h>
#pragma comment(lib, "..\\..\\log4cplus-1.2.1\\msvc10\\Win32\\bin.Debug\\log4cplusSD.lib")
unsigned CharToTchar(const char * _char, TCHAR * tchar)
{
    if (nullptr == _char || nullptr == tchar)
        return 1;
    int iLength;
    iLength = MultiByteToWideChar(0, 0, _char, strlen(_char) + 1, NULL, 0);
    MultiByteToWideChar(0, 0, _char, strlen(_char) + 1, tchar, iLength);
    return 0;
}
#else
#endif

#define MY_LOG_FILE_PATH "..\\src\\logconfig.property"


class MyLogger
{
private:
    MyLogger()
    {
        log4cplus::initialize();
        log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH));
        rootLog = log4cplus::Logger::getRoot();
        char test[16] = "test";
        
#ifdef WIN32
        TCHAR tTest[16];
        unsigned uRet = CharToTchar(test, tTest);

        if (0 == uRet)
            logger_1 = log4cplus::Logger::getInstance(tTest);
#else
        logger_1 = log4cplus::Logger::getInstance(test);
#endif
        
    }
    ~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 rootLog;    
    log4cplus::Logger logger_1;
    
};

MyLogger* MyLogger::m_logger = NULL;

#endif    //Logger_H

 

main.cpp

#include "MyLogger.h"

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

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

    LOG4CPLUS_DEBUG(myLoger->logger_1, " Service ");


    system("pause");
    return 0;
}

 

 



 

 

 

 


免責聲明!

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



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