首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++、Java、JavaScript 日誌記錄完整指南

     編輯:關於C++

程式設計中的日誌:從概念到多語言實戰

日誌是程式運行的「黑盒記錄儀」。正如人類習慣寫日記記錄生活,軟體系統透過日誌記錄運行軌跡、錯誤異常、關鍵業務數據與效能指標。良好的日誌系統是除錯、審計、監控與問題追溯的基石。

核心概念

  • 日誌級別:依嚴重程度分為 TRACE、DEBUG、INFO、WARN、ERROR、FATAL 等,便於過濾與告警。
  • 輸出目的地:控制台、檔案、資料庫、遠端日誌中心(如 ELK、Splunk)。
  • 格式化佈局:時間戳、執行緒名、類別名、行號、訊息內容,支援結構化輸出(JSON)。
  • 非同步與效能:高併發場景下採用非同步寫入、批次提交,避免阻塞主業務執行緒。

C++:log4cxx 實戰

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:三大主流體系

框架特點適用場景
java.util.logging (JUL)JDK 內建,零依賴簡單專案、不想引入第三方庫
Log4j 2高效能、非同步、豐富插件、熱重載企業級應用、高併發系統
SLF4J + Logback門面模式、API 解耦、Logback 為原生實現現代 Java 專案標準選擇

SLF4J + Logback 最佳實踐

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>

JavaScript:前端與 Node.js 日誌

瀏覽器端

  • console API:console.log/debug/info/warn/error,支援格式化佔位符 %s, %d, %o, %c。
  • log4javascript / loglevel:輕量級庫,支援級別控制、Appender 擴展。
  • 遠端上報:生產環境常將錯誤日誌透過 fetch/beacon 發送至 Sentry、Datadog 或自建收集端點。

Node.js 端

推薦 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 連線失敗'), '資料庫異常');

日誌的實戰價值

  1. 異常追蹤:結合 try-catch 記錄堆疊資訊,快速定位 Bug。
  2. 業務審計:關鍵交易(下單、支付、權限變更)記錄完整上下文。
  3. 效能分析:記錄介面延遲、SQL 耗時、快取命中率,支援火焰圖分析。
  4. 安全審計:登入失敗、權限拒絕、敏感操作留痕,滿足合規要求。

最佳實踐清單

  • ✅ 統一使用門面 API(SLF4J、log4cxx Logger、Pino logger),業務代碼不依賴具體實現。
  • ✅ 區分環境:開發環境 DEBUG 級別、生產環境 INFO/WARN 級別。
  • ✅ 結構化日誌(JSON),便於日誌平台解析、索引、告警。
  • ✅ 敏感資料脫敏:身分證、信用卡、密碼、Token 等嚴禁明文寫入日誌。
  • ✅ 適當的日誌輪轉、壓縮、保留策略,避免磁碟耗盡。
  • ✅ 關鍵路徑加入 TraceId/SpanId,實現分散式鏈路追蹤。

日誌不是「寫上去就好」,而是系統可觀測性的核心基礎設施。投入時間設計規範的日誌策略,將在後期維護中節省無數個深夜。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved