學習使用開源庫log4cpp(施工中)

開源網站: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;
}

輸出爲:

總結一下:

  1. 創建Category類對象有兩種方式,區別在於是否需要額外添加一條字符串信息作爲區分。
  2. 使用流程爲:創建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 

輸出

總結

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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