熟悉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