log4cpp學習筆記

一.簡介

Log4cpp是一個開源的C++類庫,它提供了在C++程序中使用日誌和跟蹤調試的功能。
使用log4cpp,可以很便利地將日誌或者跟蹤調試信息寫入字符流、內存字符串隊列、文件、回滾文件、調試器、Windows日誌、syslog和遠程syslog服務器中。
更多介紹請閱讀官網:
http://log4cpp.sourceforge.net/

二.編譯

1.編譯程序時記得加上 -llog4cpp -lpthread
log4cpp是線程安全的,調試多線程程序十分好用(多線程用printf調試聽說會掛起線程,效率低下)

三.簡單示例

log4app使用單例模式。

  • Appender可以定位日誌輸出信息 ,如console,或保存到文件中
  • Category可以有不同的輸出種類,Root是根輸出,可以創建子輸出,分別對應到不同的輸出位置。
  • Layout是輸出格式,其子類PatternLayout可以自定義
#include<iostream>
#include"log4cpp/Category.hh"
#include"log4cpp/FileAppender.hh"
#include"log4cpp/OstreamAppender.hh"
#include"log4cpp/Layout.hh"
#include"log4cpp/BasicLayout.hh"
#include"log4cpp/Priority.hh"

using namespace std;

int main(int argc,char *argv[]) {
    log4cpp::Appender *appender1 = new log4cpp::OstreamAppender("console",&std::cout);
    appender1->setLayout(new log4cpp::BasicLayout());

    log4cpp::Appender *appender2 = new log4cpp::FileAppender("default","program.log");
    appender2->setLayout(new log4cpp::BasicLayout());

    log4cpp::Category &root = log4cpp::Category::getRoot();
    root.setPriority(log4cpp::Priority::WARN);
    root.addAppender(appender1);

    log4cpp::Category &sub1 = log4cpp::Category::getInstance(std::string("sub1"));
    sub1.addAppender(appender2);

    //函數形式打印消息
    root.error("root error");
    root.info("root info");

    sub1.error("sub1 error");
    sub1.warn("sub1 warn");

    //打印風格輸出日誌變量
    root.warn("%d + %d = %s ?",1,1,"two");

    //流式輸出日誌信息
    root << log4cpp::Priority::ERROR <<"Streamed root error" ;
    root << log4cpp::Priority::INFO<<"Streamed root info" ;

    sub1 << log4cpp::Priority::ERROR<<"Streamed sub1 error";
    sub1 << log4cpp::Priority::WARN<<"Streamed sub1 warn" ;
}

運行後目錄下會生成program.log日誌文件
截圖:
這裏寫圖片描述

使用配置文件輸出日誌

配置文件log4cpp.properties如下:

# log4cpp.properties

log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.category.sub1=DEBUG, A1, A2
log4cpp.category.sub1.sub2=DEBUG, A3

log4cpp.appender.rootAppender=ConsoleAppender
log4cpp.appender.rootAppender.layout=PatternLayout
log4cpp.appender.rootAppender.layout.ConversionPattern=%d [%p] %m%n 

log4cpp.appender.A1=FileAppender
log4cpp.appender.A1.fileName=A1.log
log4cpp.appender.A1.layout=BasicLayout

log4cpp.appender.A2=FileAppender
log4cpp.appender.A2.threshold=WARN
log4cpp.appender.A2.fileName=A2.log
log4cpp.appender.A2.layout=PatternLayout
log4cpp.appender.A2.layout.ConversionPattern=%d [%p] %m%n 

log4cpp.appender.A3=RollingFileAppender
log4cpp.appender.A3.fileName=A3.log
log4cpp.appender.A3.maxFileSize=200
log4cpp.appender.A3.maxBackupIndex=1
log4cpp.appender.A3.layout=PatternLayout
log4cpp.appender.A3.layout.ConversionPattern=%d [%p] %m%n 
#include <log4cpp/Category.hh>
#include <log4cpp/PropertyConfigurator.hh>

int main(int argc, char* argv[])
{
    std::string initFileName = "log4cpp.properties";
    log4cpp::PropertyConfigurator::configure(initFileName);

    log4cpp::Category& root = log4cpp::Category::getRoot();

    log4cpp::Category& sub1 = 
        log4cpp::Category::getInstance(std::string("sub1"));

    log4cpp::Category& sub2 = 
        log4cpp::Category::getInstance(std::string("sub1.sub2"));

    root.warn("Storm is coming");

    sub1.debug("Received storm warning");
    sub1.info("Closing all hatches");

    sub2.debug("Hiding solar panels");
    sub2.error("Solar panels are blocked");
    sub2.debug("Applying protective shield");
    sub2.warn("Unfolding protective shield");
    sub2.info("Solar panels are shielded");

    sub1.info("All hatches closed");

    root.info("Ready for storm.");

    log4cpp::Category::shutdown();

    return 0;
}

運行截圖:
這裏寫圖片描述

目錄下會多出幾個日誌文件:
A1.log A2.log
A3.log A3.log.1(備份)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章