| 維度 | Log4j / Log4j2 / SLF4J | JDBMonitor |
|---|---|---|
| 核心使命 | 通用應用日誌:業務流程、異常堆疊、審計追蹤、效能指標 | 專用資料庫 SQL 監控:執行計劃、參數綁定、慢查詢、連接洩漏 |
| 侵入性 | 侵入式:代碼中硬編碼 log.info()、log.debug() | 零侵入:JDBC 代理攔截,僅修改連接字串 |
| 配置複雜度 | 高:Appender、Layout、Logger、Level、Filter 多維配置 | 低:單一 config.xml 定義 Listener、輸出目標 |
| 效能影響 | 同步寫入阻塞業務執行緒,高併發下可成瓶頸 | 異步專用執行緒寫入,近零業務影響 |
| SQL 專用功能 | 無:需自行格式化 SQL、參數、耗時、連接資訊 | 內建:自動格式化、參數展開、耗時統計、執行計劃解析 |
| 開發調試體驗 | 控制台刷屏、緩衝區截斷、無法篩選、無法關聯事務 | Swing 客戶端:類 SQL Profiler,支援篩選、排序、事務關聯、遠程監控 |
// 業務代碼
public void transfer(Account from, Account to, BigDecimal amount) {
log.info("轉賬開始: {} -> {}, 金額: {}", from.getId(), to.getId(), amount);
dao.updateBalance(from, -amount);
dao.updateBalance(to, amount);
log.info("轉賬完成");
}
缺點:日誌與業務邏輯耦合,重構時易遺漏/錯位;生產環境調整日誌級別需重新部署 (除非支援 JMX 動態配置)。
# 原連接串
jdbc:mysql://localhost:3306/app?user=root&password=123
# 接入 JDBMonitor 後
jdbc:jdbmonitor:listenerconfig=/config.xml:url=jdbc:mysql://localhost:3306/app?user=root&password=123
原理:DBDriver 實現 java.sql.Driver,識別 listenerconfig= 前綴,代理 Connection/Statement/PreparedStatement,攔截 executeQuery/update,記錄後委派真實驅動。
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 業務流程追蹤、異常診斷、審計合規 | Log4j2 + SLF4J | 結構化日誌、多輸出目標、動態級別、成熟生態 |
| SQL 效能調優、慢查詢定位、參數綁定分析 | JDBMonitor | 零侵入、自動格式化、專用客戶端、不影響業務效能 |
| 生產故障現場 SQL 重現 | JDBMonitor (遠程 Socket 模式) | 無需重啟應用,動態接入,實時流式輸出 |
| CI/CD 流水線自動化測試驗證 SQL | JDBMonitor + 自定義 Listener | 可編程驗證 SQL 條數、執行時間、執行計劃 |
| 微服務分布式追蹤關聯 SQL | Log4j2 (MDC) + SkyWalking/Zipkin | TraceId 注入日誌與 SQL,全鏈路關聯 |
**不要二選一,要分層部署:**
traceId,JDBMonitor Listener 讀取 MDC 同步寫入 SQL 日誌,實現「業務日誌 ↔ SQL 日誌」雙向跳轉。<!-- config.xml -->
<jdbmonitor>
<listener name="file" class="com.cownew.jdbmonitor.listener.FileListener">
<property name="path" value="/var/log/jdbmonitor/sql.log"/>
<property name="maxSize" value="100MB"/>
<property name="encoding" value="UTF-8"/>
</listener>
<listener name="socket" class="com.cownew.jdbmonitor.listener.SocketListener">
<property name="port" value="8888"/>
</listener>
<filter>
<!-- 僅記錄超過 500ms 的慢查詢 -->
<property name="slowQueryThreshold" value="500"/>
<!-- 過滤健康檢查查詢 -->
<property name="excludePatterns" value="SELECT 1,SELECT NOW()"/>
</filter>
</jdbmonitor>
Log4j 是應用的「黑盒記錄儀」,JDBMonitor 是資料庫的「心電圖監護儀」。兩者觀測維度正交,缺一不可。現代觀測體系應採用 **「業務日誌標準化 + SQL 監控專用化 + TraceId 全鏈路關聯」** 三位一體架構,而非在單一工具上妥協。