log4cplus 輸出日誌

熟悉java的人都知道log4j。log4cplus 是C++版本的log4j。具體區別比較可以參考https://blog.csdn.net/jmppok/article/details/17357073

log4cplus 主要由三大組件構成

log4cxx有三個主要組件:loggers(記錄器),appenders(輸出源)和layout(佈局)。可以簡單理解爲日誌類別,要輸出的地方,輸出形式。

1) Loggers

2) Appenders

3) Layouts

綜合使用三大組件可以輕鬆記錄信息的類別和級別,並可以在運行時控制日誌輸出的樣式和位置。

 詳細的配置選項可以參考文章https://blog.csdn.net/u012632043/article/details/79746573。這裏我就不過多敘述了。本文專注於如何快速使用log4cplus輸出日誌信息,配置細節等需要的時候去看。

  • 源碼下載

地址:https://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.2.0/

解壓結構:

  • 編譯

打開msvc10文件夾,默認是vs2010的項目,我用vs2013打開,編譯通過。項目結構概述如下

Tests: 對log4cplus 各個部分編寫的測試用例,如果需要可以關注一下。

log4cplus: 編譯出靜態庫

log4cplusS: 編譯生成靜態庫

loggingserver: 這個項目有大用,針對的是分佈式系統,日誌統一輸出的場景。 通過SocketAppender將日誌輸出到一個指定的log server上,在一臺服務器上可以查看完整的日誌記錄,不需要登陸多臺服務器。詳細使用信息可以參考https://my.oschina.net/u/2326085/blog/391372?p=1

  • 運行

運行的時候通過一個簡單的類進行封裝,但是遇到一個問題,如果通過靜態文件進行集成,一直提示無法加載配置文件,後來切換爲通過動態庫的形式纔不報錯了。不清楚是我程序設置的問題,還是log4cplus 1.2的版本確實存在這個問題。

簡單封裝如下

#pragma once
#include <xstring>
#include <mutex>
#include <log4cplus/logger.h>

class CCLogMgrImpl
{
public:
	static CCLogMgrImpl * Get()
	{
		return m_instance;
	}
	virtual ~CCLogMgrImpl();

private:
	CCLogMgrImpl();
	static CCLogMgrImpl* m_instance;

public:
	void OutPutWarnning(const std::string& str);
	void OutPutError(const std::string& str);
	void OutPutDebug(const std::string& str);
	void OutPutInfo(const std::string& str);
	void OutPutFatal(const std::string& str);

private:
	std::mutex m_mutex;
	log4cplus::Logger m_logMgr;
};

 

#include "stdafx.h"
#include "CLogMgrImpl.h"

#include <string>
#include <cstdio>
#include <log4cplus/configurator.h>
#include <log4cplus/appender.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/loglevel.h>
#include <log4cplus/tstring.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/helpers/loglog.h>

using namespace log4cplus::helpers;
//外部初始化 before invoke main
CCLogMgrImpl* CCLogMgrImpl::m_instance = new CCLogMgrImpl();


CCLogMgrImpl::CCLogMgrImpl()
{
	log4cplus::initialize();
	try
	{
		// 加載配置文件: "log4cplus.properties"
		log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus.properties"));
		m_logMgr = log4cplus::Logger::getInstance("logmgr");
	}
	catch (...)
	{
	}
}


void CCLogMgrImpl::OutPutWarnning(const std::string& str)
{
	std::lock_guard<std::mutex> lock(m_mutex);
	LOG4CPLUS_WARN(m_logMgr, LOG4CPLUS_TEXT(str));
}

void CCLogMgrImpl::OutPutError(const std::string& str)
{
	std::lock_guard<std::mutex> lock(m_mutex);
	LOG4CPLUS_ERROR(m_logMgr, LOG4CPLUS_TEXT(str));
}

void CCLogMgrImpl::OutPutDebug(const std::string& str)
{
	std::lock_guard<std::mutex> lock(m_mutex);
	LOG4CPLUS_DEBUG(m_logMgr, LOG4CPLUS_TEXT(str));
}

void CCLogMgrImpl::OutPutInfo(const std::string& str)
{
	std::lock_guard<std::mutex> lock(m_mutex);
	LOG4CPLUS_INFO(m_logMgr, LOG4CPLUS_TEXT(str));
}

void CCLogMgrImpl::OutPutFatal(const std::string& str)
{
	std::lock_guard<std::mutex> lock(m_mutex);
	LOG4CPLUS_FATAL(m_logMgr, LOG4CPLUS_TEXT(str));
}

CCLogMgrImpl::~CCLogMgrImpl()
{
	log4cplus::Logger::shutdown();
}

 

配置文件如下, 配置信息參考https://blog.csdn.net/u010607621/article/details/54944696

#log4cplus.properties
---------------------------------------
#這裏命名logger對象。我給logger對象的命名是logmgr(表示輸出程序基礎運行平臺的日誌)和loggerMkt(表示輸出行情業務相關的日誌)
#每個logger對象可以使用多個appender對象(這裏有logger,apdMkt)。類似於每次打日誌的時候,會輸出到多個文件。(ALL是我調試時用的)
log4cplus.logger.logmgr=ALL, logger

#開啓追加模式
log4cplus.rootLogger = TRACE, MyAppend 
log4cplus.appender.MyAppend.Append = true

#對appender對象logger進行設置。TimeBasedRollingFileAppender可以按日期轉儲日誌文件
log4cplus.appender.logger=log4cplus::TimeBasedRollingFileAppender
log4cplus.appender.logger.FilenamePattern=log/%d{yyyy-MM-dd}/radar.log
log4cplus.appender.logger.Append=true
log4cplus.appender.logger.MaxHistory=999
log4cplus.appender.logger.ImmediateFlush=true
log4cplus.appender.logger.RollOnClose=false
log4cplus.appender.logger.CreateDirs=true
log4cplus.appender.logger.layout=log4cplus::PatternLayout
log4cplus.appender.logger.layout.ConversionPattern=[%T] %D{%Y-%m-%d %H:%M:%S.%q} %-5p - %m [%c]%n

#可不配置。日誌文件會按此等級範圍顯示
#log4cplus.appender.apdRoot.filters.1=log4cplus::spi::LogLevelRangeFilter
#log4cplus.appender.apdRoot.filters.1.LogLevelMin=ERROR
#log4cplus.appender.apdRoot.filters.1.LogLevelMax=FATAL
 

 

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