開源網站:http://log4cpp.sourceforge.net
類:http://log4cpp.sourceforge.net/api/annotated.html
動態庫鏈接問題:https://blog.csdn.net/inuyashaw/article/details/70789230
相關博客:https://blog.csdn.net/liuhong135541/article/category/1496383
上面開源網站中提供了多個樣例,接下來我將對每個案例進行分析和總結,繼而學會如何使用;此外,還包含了我在使用中遇到的一些問題及解決方法。當然這篇博客只是作爲我輔助學習開源庫使用的一種方法,所以做的不好,請諒解。強烈推薦直接看英文原文的開源網站,可能開始不適應,但是慢慢就習慣了。
前期準備流程
首先,要下載源碼,然後按照開源網站上的操作步驟進行操作,然後通過對下邊源代碼進行編譯測試是否成功。編譯時要加上
-llog4cpp 和 -lpthread 。這兩個的順序反過來會出現一個問題,不明白如何解決,但是不影響使用,這裏就先不管了。
如果出現動態庫鏈接問題,可以參考頂部的那篇博客,更新動態庫鏈接的緩衝文件。
格式介紹
Makefile
SRCS:=$(wildcard *.cc)
OBJS:=$(patsubst %.cc,%.o,$(SRCS))
TARGETS:=$(patsubst %.cc,%,$(SRCS))
CC:=g++
all:$(TARGETS)
%:%.cc
$(CC) $< -o $@ -llog4cpp -lpthread
.PHONY:clean
clean:
rm $(TARGETS)
樣例一
源代碼
#include "log4cpp/Category.hh"
#include "log4cpp/Appender.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/OstreamAppender.hh"
#include "log4cpp/Layout.hh"
#include "log4cpp/BasicLayout.hh"
#include "log4cpp/Priority.hh"
int main(int argc, char** argv) {
/*log4cpp::Appender 設置屬性和格式
*創建log4cpp::Appender對象,將對象綁定到標準輸出
*/
log4cpp::Appender *appender1 = new log4cpp::OstreamAppender("console", &std::cout);
/*設置輸出格式*/
appender1->setLayout(new log4cpp::BasicLayout());
/*設置第二個,將對象綁定到program.log文件上*/
log4cpp::Appender *appender2 = new log4cpp::FileAppender("default", "program.log");
appender2->setLayout(new log4cpp::BasicLayout());
/*創建Category類對象*/
log4cpp::Category& root = log4cpp::Category::getRoot();
/*綁定log4cpp::Appender對象和Category類對象 和 設置優先級*/
root.setPriority(log4cpp::Priority::WARN);
root.addAppender(appender1);
/*創建Category類對象,這樣創建,輸出的每條信息都會帶有sub1字符串*/
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");
/*通過類似於printf風格的方式使用*/
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";
/*另外的一種方式*/
root.errorStream() << "Another streamed error";
return 0;
}
輸出爲:
總結一下:
- 創建Category類對象有兩種方式,區別在於是否需要額外添加一條字符串信息作爲區分。
- 使用流程爲:創建append綁定文件(標準輸出或者普通日誌文件),設置輸出格式,創建Category類對象(兩種方式)並與log4cpp::Appender對象綁定,然後設置優先級(好像getRoot()方法創建的才需要)。 最後,在需要的時候調用方法進行輸出即可。
樣例二,通過文件配置log4cpp::Appender對象
源代碼
#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;
}
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
輸出
總結