一.簡介
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(備份)