簡介
log4cplus 是 Apache log4j 的 C++ 移植版,功能全面、線程安全、靈活配置。核心優勢:**開發者可自定義日誌格式、輸出目標(控制台、文件、網絡等)、分級過濾**,避免 glog 產生海量碎片文件。
五大核心組件
| 組件 | 職責 | 常用實現 |
| Logger | 日誌記錄器,業務代碼直接調用 | Logger::getInstance("name") |
| Appender | 輸出目的地 | ConsoleAppender、FileAppender、RollingFileAppender、SocketAppender |
| Layout | 輸出格式化 | PatternLayout (printf 風格)、TTCCLayout |
| Filter | 過濾器,決定是否輸出 | LogLevelMatchFilter、DenyAllFilter |
| Priority/Level | 優先級 | TRACE < DEBUG < INFO < WARN < ERROR < FATAL |
Linux 源碼安裝
tar xvzf log4cplus-x.x.x.tar.gz
cd log4cplus-x.x.x
./configure --prefix=/usr/local/log4cplus
make
sudo make install
C++ 代碼配置範例(程序化配置)
#include <iostream>
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/layout.h>
using namespace std;
using namespace log4cplus;
int main()
{
SharedObjectPtr<Appender> append(new FileAppender("master.log"));
append->setName("append for master");
std::auto_ptr<Layout> layout(new PatternLayout(
"%d{%m/%d/%y %H:%M:%S} %p [%l]: %m %n"));
append->setLayout(layout);
Logger logger = Logger::getInstance("master");
logger.addAppender(append);
logger.setLogLevel(ALL_LOG_LEVEL);
LOG4CPLUS_DEBUG(logger, "This is the FIRST log message");
return 0;
}
配置文件方式 (log4cplus.properties)
log4cplus.rootLogger=DEBUG, stdout, file
log4cplus.appender.stdout=log4cplus::ConsoleAppender
log4cplus.appender.stdout.layout=log4cplus::PatternLayout
log4cplus.appender.stdout.layout.ConversionPattern=%d{%Y-%m-%d %H:%M:%S} [%p] %m%n
log4cplus.appender.file=log4cplus::RollingFileAppender
log4cplus.appender.file.File=app.log
log4cplus.appender.file.MaxFileSize=10MB
log4cplus.appender.file.MaxBackupIndex=5
log4cplus.appender.file.layout=log4cplus::PatternLayout
log4cplus.appender.file.layout.ConversionPattern=%d{%Y-%m-%d %H:%M:%S} [%p] [%l] %m%n
常用 Pattern 佔位符
| 符號 | 含義 |
%d | 日期時間,支持格式如 %d{%Y-%m-%d %H:%M:%S} |
%p | 優先級 (DEBUG/INFO/WARN...) |
%l | 位置信息 (文件:行:函數) |
%m | 用戶日誌信息 |
%n | 換行符 |
%c | Logger 名稱 |
%t | 線程 ID |
避坑指南
- 靜態鏈接運行庫 (MT) vs 動態 (MD):專案與 log4cplus 必須一致,否則運行時崩潰。
- 宏記錄器自動捕獲上下文:優先使用
LOG4CPLUS_DEBUG/INFO/WARN/ERROR/FATAL 宏,而非直接調用 logger.log()。
- RollingFileAppender 防止單文件過大:設置
MaxFileSize、MaxBackupIndex 自動分割備份。
- 異步 Appender:高併發場景用
AsyncAppender 解耦 I/O,降低業務線程延遲。