log4cxx 是 log4j 的 C++ 移植版,支援透過外部設定檔動態調整日誌行為,無需重新編譯。本文示範核心 API 用法、設定檔寫法與多 Logger 隔離最佳實踐。
基本使用流程
#include <log4cxx/logger.h>
#include <log4cxx/logstring.h>
#include <log4cxx/propertyconfigurator.h>
using namespace log4cxx;
int main() {
// 1. 載入設定檔
PropertyConfigurator::configure("log4cxx.cfg");
// 2. 取得具名 Logger(建議每類別一個)
LoggerPtr logger1 = Logger::getLogger("TraceYourMama");
LoggerPtr logger2 = Logger::getLogger("Patch");
// 3. 記錄各等級日誌
LOG4CXX_TRACE(logger1, "追蹤");
LOG4CXX_DEBUG(logger1, "除錯");
LOG4CXX_WARN(logger1, "警告");
LOG4CXX_ERROR(logger1, "錯誤");
LOG4CXX_FATAL(logger1, "致命");
LOG4CXX_ASSERT(logger1, false, "斷言失敗");
LOG4CXX_TRACE(logger2, "追蹤");
LOG4CXX_ERROR(logger2, "錯誤");
return 0;
}
設定檔 log4cxx.cfg 完整範例
# 根 Logger 設定(預設落地)
log4j.rootLogger=DEBUG, consoleAppender
# 特定 Logger 覆蓋等級與 Appender
log4j.logger.TraceYourMama=ERROR, fileAppender, consoleAppender
log4j.logger.Patch=TRACE, consoleAppender
# 關閉加算性(預設 true,子 Logger 會繼承父 Appender)
log4j.additivity.TraceYourMama=false
log4j.additivity.Patch=false
# === Appender 定義 ===
# 主控台 Appender
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} - %m%n
# 檔案 Appender(支援滾動)
log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=logs/app.log
log4j.appender.fileAppender.MaxFileSize=10MB
log4j.appender.fileAppender.MaxBackupIndex=5
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} %x - %m%n
# 非同步 Appender(高效能場景)
log4j.appender.asyncAppender=org.apache.log4j.AsyncAppender
log4j.appender.asyncAppender.BufferSize=512
log4j.appender.asyncAppender.appenderRef=fileAppender
PatternLayout 格式化符號速查
| 符號 | 含義 | 範例輸出 |
%d | 時間戳記 | 2024-01-15 14:30:45,123 |
%p | 日誌等級 | DEBUG, WARN |
%c | Logger 名稱 | com.module.Class |
%c{2} | Logger 末兩段 | module.Class |
%t | 執行緒名稱/ID | main, Thread-3 |
%m | 訊息內容 | 使用者傳入字串 |
%n | 換行符 | 平台相關 |
%x | NDC (巢狀診斷脈絡) | [user=123][req=456] |
%X{key} | MDC (映射診斷脈絡) | %X{sessionId} |
%F, %L, %M | 檔案/行號/函式(效能較差) | main.cpp:42:main |
進階技巧:類別級 Logger 靜態實例
// MyClass.h
#include <log4cxx/logger.h>
class MyClass {
static log4cxx::LoggerPtr logger; // 宣告
public:
void doSomething();
};
// MyClass.cpp
log4cxx::LoggerPtr MyClass::logger = log4cxx::Logger::getLogger("MyClass");
void MyClass::doSomething() {
LOG4CXX_DEBUG(logger, "處理中...");
}
效能優化關鍵
- 等級檢查前置:巨量追蹤日誌時,先判斷
logger->isDebugEnabled() 避免字串組裝開銷。
- 非同步 Appender:高頻日誌場景採用
AsyncAppender 解耦 I/O 阻塞。
- 避免
%F %L %M:除錯版本才啟用,正式版移除以減少堆疊走訪成本。
- 滾動檔案策略:
RollingFileAppender + MaxFileSize/MaxBackupIndex 防止磁碟爆滿。
常見問題排查
| 現象 | 可能原因 | 解決方案 |
| 無輸出 | 設定檔路徑錯誤/Logger 名稱拼寫不符 | 啟用 log4j.debug=true 觀察初始化日誌 |
| 重複輸出 | additivity=true 且父子皆掛同一 Appender | 設定 additivity=false 或調整 Appender 分配 |
| 中文亂碼 | 設定檔編碼/終端機編碼不一致 | 統一 UTF-8,ConsoleAppender 加 encoding=UTF-8 |
| 連結錯誤 | Unicode/ANSI 建置不匹配 | 專案屬性統一字元集,log4cxx 預編譯選項對齊 |
log4cxx 以「設定檔驅動、Logger 階層、Appender 可插拔」三大特性,成為 C++ 專案標準化日誌的首選方案。善用多 Logger 隔離業務域、非同步寫入提升吞吐、滾動檔案保障穩定,即可構建生產級觀測體系。
- 上一篇文章: Access MDB 密碼破解原理解析:從 Access 97 到 2000/2002 的演進與對策
- 下一篇文章: C++Builder WebSnap/IntraWeb 實作 Cookie 讀寫完整指南
Copyright ©
程式碼之家 All Rights Reserved