日誌是程式運行的「黑盒記錄儀」。正如人類習慣寫日記記錄生活,軟體系統透過日誌記錄運行軌跡、錯誤異常、關鍵業務數據與效能指標。良好的日誌系統是除錯、審計、監控與問題追溯的基石。
log4cxx 是 Apache log4j 移植的 C++ 版本,跨平台、功能豐富。編譯步驟較繁瑣(需 APR、APR-util、XML 庫),建議使用 CMake 或 vcpkg 管理依賴。
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
int main() {
LoggerPtr logger(Logger::getLogger("MyApp"));
// 簡單配置:輸出到控制台
BasicConfigurator::configure();
LOG4CXX_DEBUG(logger, "除錯資訊");
LOG4CXX_INFO(logger, "一般資訊");
LOG4CXX_WARN(logger, "警告訊息");
LOG4CXX_ERROR(logger, "錯誤訊息");
return 0;
}
# log4cxx.properties log4j.rootLogger=DEBUG, consoleAppender, fileAppender log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout log4j.appender.consoleAppender.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 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 [%t] %-5p %c - %m%n
代碼中載入:PropertyConfigurator::configure("log4cxx.properties");
| 框架 | 特點 | 適用場景 |
|---|---|---|
| java.util.logging (JUL) | JDK 內建,零依賴 | 簡單專案、不想引入第三方庫 |
| Log4j 2 | 高效能、非同步、豐富插件、熱重載 | 企業級應用、高併發系統 |
| SLF4J + Logback | 門面模式、API 解耦、Logback 為原生實現 | 現代 Java 專案標準選擇 |
Maven 依賴
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.11</version>
</dependency>
logback-spring.xml 關鍵配置
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
console.log/debug/info/warn/error,支援格式化佔位符 %s, %d, %o, %c。fetch/beacon 發送至 Sentry、Datadog 或自建收集端點。推薦 Pino(極致效能、JSON 輸出)或 Winston(功能全面、多 Transport)。
// Pino 範例
const pino = require('pino');
const logger = pino({ level: 'info', transport: { target: 'pino-pretty' } });
logger.info({ userId: 123 }, '用戶登入');
logger.error(new Error('DB 連線失敗'), '資料庫異常');
try-catch 記錄堆疊資訊,快速定位 Bug。日誌不是「寫上去就好」,而是系統可觀測性的核心基礎設施。投入時間設計規範的日誌策略,將在後期維護中節省無數個深夜。