🚀 PandaCoder 2.0.0 - ES DSL Monitor & SQL Monitor 震撼發布!
?? PandaCoder 2.0.0 - ES DSL Monitor & SQL Monitor 震撼發布!
讓數據庫查詢和搜索引擎調用一目了然!
告別盲目調試,擁抱可視化監控時代!
?? 目錄
?? 功能介紹
ES DSL Monitor - Elasticsearch 查詢監控
像 MyBatis Log 一樣,實時捕獲和展示 Elasticsearch 查詢!
? 核心特性
- ?? 實時監控:自動捕獲所有 ES 查詢,無需修改代碼
- ?? 可視化展示:獨立工具窗口,清晰展示查詢詳情
- ?? 智能解析:支持多種日志格式(REST Client、cURL、Spring Data ES)
- ?? API 關聯:自動關聯觸發查詢的 API 接口
- ?? 持久化存儲:自動保存查詢歷史,方便回溯分析
- ?? 零性能損耗:異步處理,不影響 IDEA 運行速度
?? 監控內容
| 字段 | 說明 | 示例 |
|---|---|---|
| 方法 | HTTP 方法 | GET / POST / PUT / DELETE |
| 索引 | ES 索引名稱 | torchv_chunk_dims_1024 |
| 端點 | 請求端點 | /_search / /_count |
| DSL 查詢 | 完整的查詢 JSON | {"query": {"bool": {...}}} |
| API 路徑 | 觸發查詢的 API | /api/vector/search |
| 調用類 | 發起查詢的 Java 類 | VectorDataRetrieverElastic.java:125 |
| 執行時間 | 查詢耗時 | 23 ms |
| 響應 | ES 返回的響應 | {"took": 5, "hits": {...}} |
SQL Monitor - SQL 查詢監控
完美復刻 MyBatis Log Plugin 的功能,在 IDEA 中原生支持!
? 核心特性
- ?? 完整 SQL 記錄:捕獲所有 MyBatis SQL 查詢
- ?? 參數替換:自動生成可執行的 SQL(參數已替換)
- ?? 智能分類:按操作類型(SELECT/INSERT/UPDATE/DELETE)分類
- ?? 統計分析:實時統計各類 SQL 數量和表訪問情況
- ?? API 追蹤:自動關聯觸發 SQL 的 API 接口
- ?? 顏色標識:不同操作類型使用不同顏色,一目了然
?? 監控內容
| 字段 | 說明 | 示例 |
|---|---|---|
| 操作 | SQL 操作類型 | SELECT / INSERT / UPDATE / DELETE |
| 表名 | 操作的數據庫表 | user / order |
| SQL 語句 | 原始 SQL(帶占位符) | SELECT * FROM user WHERE id = ? |
| 參數 | 綁定的參數值 | 123(Integer) |
| 可執行 SQL | 參數已替換的 SQL | SELECT * FROM user WHERE id = 123 |
| 結果數 | 查詢返回的記錄數 | 10 |
| API 路徑 | 觸發 SQL 的 API | /api/user/list |
| 調用類 | Mapper 接口 | UserMapper.selectById |
| 執行時間 | SQL 耗時 | 15 ms |
?? 為什么需要這兩個監控工具
傳統開發的痛點
?? Elasticsearch 調試困境
// 代碼中構建復雜的 ES 查詢
NativeQuery query = NativeQuery.builder()
.withQuery(boolQuery)
.withKnnQuery(knnQuery)
.withPageable(pageable)
.build();
SearchHits<Document> hits = elasticsearchTemplate.search(query, Document.class);
// ? 問題:
// 1. 不知道實際發送給 ES 的 DSL 是什么樣的
// 2. 無法直接在 Kibana 中測試
// 3. 調試時需要手動打印 JSON
// 4. 向量數據太長,難以閱讀
?? SQL 調試困境
// MyBatis Mapper 調用
List<User> users = userMapper.selectByCondition(condition);
// ? 問題:
// 1. 不知道實際執行的 SQL 是什么
// 2. 參數綁定是否正確?
// 3. 是否觸發了 N+1 查詢?
// 4. 哪個 API 調用了這個 SQL?
?? 使用監控工具后
? ES DSL Monitor 帶來的改變
? 實時看到完整的 ES 查詢:
╔═══════════════════════════════════════════════════════════════
║ ES DSL Query
╠═══════════════════════════════════════════════════════════════
║ Method: POST
║ Index: torchv_chunk_dims_1024
║ Endpoint: /_search
║ API Path: /api/vector/search
║ Caller: VectorDataRetrieverElastic.java:125
║
║ DSL:
║ {
║ "query": {
║ "bool": {
║ "must": [
║ {"match": {"content": {"query": "用戶輸入", "boost": 0.3}}}
║ ]
║ }
║ },
║ "knn": {
║ "field": "vector",
║ "k": 10,
║ "num_candidates": 50,
║ "query_vector": [0.123, 0.456, ...]
║ },
║ "size": 10
║ }
║
║ Response: 156 hits in 23ms
╚═══════════════════════════════════════════════════════════════
? 好處:
1. 一鍵復制 DSL,直接在 Kibana 測試
2. 清晰看到查詢結構和參數
3. 追蹤 API 到 ES 查詢的完整鏈路
4. 發現性能瓶頸
? SQL Monitor 帶來的改變
? 實時看到完整的 SQL 執行:
╔═══════════════════════════════════════════════════════════════
║ SQL Query
╠═══════════════════════════════════════════════════════════════
║ Operation: SELECT
║ Table: user
║ API Path: /api/user/list
║ Caller: UserMapper.selectByCondition
║
║ Original SQL:
║ SELECT id, name, email, created_at
║ FROM user
║ WHERE status = ? AND created_at > ?
║ ORDER BY id DESC
║ LIMIT ?
║
║ Parameters:
║ 1(Integer), 2025-01-01 00:00:00(Timestamp), 10(Integer)
║
║ Executable SQL:
║ SELECT id, name, email, created_at
║ FROM user
║ WHERE status = 1 AND created_at > '2025-01-01 00:00:00'
║ ORDER BY id DESC
║ LIMIT 10
║
║ Result: 10 rows in 15ms
╚═══════════════════════════════════════════════════════════════
? 好處:
1. 一鍵復制可執行 SQL,直接在數據庫工具運行
2. 清晰看到參數綁定
3. 追蹤 API 到 SQL 的完整鏈路
4. 發現 N+1 查詢問題
5. 優化慢查詢
?? 快速開始
第一步:安裝插件
- 打開 IntelliJ IDEA
Settings→Plugins→ 搜索PandaCoder- 點擊
Install安裝 - 重啟 IDEA
第二步:打開工具窗口
在 IDEA 底部工具欄找到:
- ?? ES DSL Monitor - Elasticsearch 圖標
- ??? SQL Monitor - MySQL 圖標
第三步:啟用監聽
在對應的工具窗口中:
- ? 勾選 "啟用 ES 監聽" 或 "啟用 SQL 監聽"
第四步:配置日志輸出(重要!)
這是最關鍵的一步! 如果不配置日志,監控工具無法捕獲查詢。
?? 詳細配置指南
ES DSL Monitor 配置
配置原理說明
為什么需要配置日志?
ES DSL Monitor 的工作原理是監聽 IDEA 控制臺的輸出,解析其中的 Elasticsearch 查詢日志。但是,Elasticsearch 客戶端默認不會輸出詳細的查詢日志,需要手動配置日志級別。
這類似于 MyBatis 需要配置 DEBUG 日志才能看到 SQL 一樣。
方式 1:配置 Logback(推薦)
如果你的項目使用 Logback(Spring Boot 默認),在 src/main/resources/logback-spring.xml 或 logback-local.xml 中添加:
<configuration>
<!-- 現有配置保持不變... -->
<!-- ===== Elasticsearch 日志配置(新增) ===== -->
<!-- Elasticsearch Java Client 請求日志 -->
<logger name="org.elasticsearch.client" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
<!-- Spring Data Elasticsearch 查詢日志 -->
<logger name="org.springframework.data.elasticsearch" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
<!-- Elasticsearch RestClient 詳細日志 -->
<logger name="org.elasticsearch.client.RestClient" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
<!-- Elasticsearch 請求追蹤(最詳細,強烈推薦!) -->
<logger name="tracer" level="TRACE">
<appender-ref ref="STDOUT" />
</logger>
</configuration>
配置說明:
| Logger 名稱 | 級別 | 作用 | 是否必需 |
|---|---|---|---|
org.elasticsearch.client |
DEBUG | 輸出 ES 客戶端基礎日志 | ??? 推薦 |
org.elasticsearch.client.RestClient |
DEBUG | 輸出 HTTP 請求/響應 | ???? 重要 |
org.springframework.data.elasticsearch |
DEBUG | Spring Data ES 查詢日志 | ??? 推薦 |
tracer |
TRACE | 輸出完整的 cURL 格式請求 | ????? 必需 |
?? 重點:tracer 日志是最重要的! 它會輸出類似以下格式的日志:
curl -iX POST "localhost:9200/torchv_chunk_dims_1024/_search?typed_keys=true" -H "Content-Type: application/json" -d '
{
"query": {
"bool": {
"must": [
{"match": {"content": {"query": "用戶查詢", "boost": 0.3}}}
]
}
},
"knn": {
"field": "vector",
"k": 10,
"num_candidates": 50,
"query_vector": [0.123, 0.456, ...]
},
"size": 10
}'
# {
# "took": 5,
# "hits": {
# "total": {"value": 156},
# "hits": [...]
# }
# }
這種格式包含了:
- ? 完整的 HTTP 方法和 URL
- ? 完整的 DSL 查詢 JSON
- ? 完整的響應 JSON
- ? 可以直接復制到終端執行
方式 2:配置 application.yml
在 src/main/resources/application.yml 或 application-dev.yml 中添加:
# 日志配置
logging:
level:
# Elasticsearch 客戶端日志
org.elasticsearch.client: DEBUG
org.elasticsearch.client.RestClient: DEBUG
# Spring Data Elasticsearch
org.springframework.data.elasticsearch: DEBUG
org.springframework.data.elasticsearch.client.elc: DEBUG
# HTTP 追蹤(最重要!)
tracer: TRACE
?? 注意:
- 如果同時配置了
logback.xml和application.yml,logback.xml的配置優先級更高 - 建議在
logback.xml中配置,更靈活
方式 3:配置 Log4j2(如果使用 Log4j2)
在 src/main/resources/log4j2.xml 中添加:
<Configuration>
<!-- 現有配置... -->
<!-- Elasticsearch 日志配置 -->
<Loggers>
<Logger name="org.elasticsearch.client" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.elasticsearch.client.RestClient" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.springframework.data.elasticsearch" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="tracer" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
</Configuration>
驗證配置是否生效
配置完成后,重啟應用程序,在 IDEA 控制臺應該能看到類似以下內容:
2025-10-19 15:30:45.123 TRACE tracer - curl -iX POST "localhost:9200/index_name/_search" -d '{"query": {...}}'
如果看到了,說明配置成功! ?
如果沒看到,請檢查:
- ? 配置文件路徑是否正確
- ? 日志級別是否設置為 TRACE
- ? 是否重啟了應用程序
- ? 是否在正確的 profile 中配置(如 dev/local)
SQL Monitor 配置
配置原理說明
為什么需要配置日志?
SQL Monitor 的工作原理是監聽 MyBatis 輸出的 SQL 日志。MyBatis 在 DEBUG 級別會輸出完整的 SQL 執行信息:
==> Preparing: SELECT * FROM user WHERE id = ?
==> Parameters: 123(Integer)
<== Total: 1
如果日志級別設置為 INFO 或更高,這些日志不會輸出,SQL Monitor 就無法捕獲。
方式 1:配置 Logback(推薦)
在 logback-spring.xml 或 logback-local.xml 中添加:
<configuration>
<!-- 現有配置保持不變... -->
<!-- ===== MyBatis SQL 日志配置(新增) ===== -->
<!-- 方式 A:配置 Mapper 接口包路徑(推薦) -->
<logger name="com.yourpackage.mapper" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
<!-- 或者 -->
<!-- 方式 B:配置 MyBatis Plus(如果使用 MyBatis Plus) -->
<logger name="com.baomidou.mybatisplus" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
<!-- 或者 -->
<!-- 方式 C:配置所有 MyBatis 日志 -->
<logger name="org.apache.ibatis" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
</configuration>
配置說明:
| 配置方式 | Logger 名稱 | 說明 | 推薦度 |
|---|---|---|---|
| 方式 A | com.yourpackage.mapper |
只輸出你的 Mapper 接口的 SQL | ????? 最推薦 |
| 方式 B | com.baomidou.mybatisplus |
MyBatis Plus 的 SQL | ???? 推薦 |
| 方式 C | org.apache.ibatis |
所有 MyBatis 日志(可能很多) | ??? 一般 |
?? 注意: 請將 com.yourpackage.mapper 替換為你項目中 Mapper 接口的實際包路徑!
示例:
-
如果你的 Mapper 在
com.example.demo.mapper包下,配置為:<logger name="com.example.demo.mapper" level="DEBUG"> -
如果你的 Mapper 在
com.torchv.application.mapper包下,配置為:<logger name="com.torchv.application.mapper" level="DEBUG">
方式 2:配置 application.yml
在 application.yml 或 application-dev.yml 中添加:
# 日志配置
logging:
level:
# 方式 A:配置 Mapper 接口包路徑(推薦)
com.yourpackage.mapper: DEBUG
# 或者
# 方式 B:配置 MyBatis Plus
com.baomidou.mybatisplus: DEBUG
# 或者
# 方式 C:配置所有 MyBatis 日志
org.apache.ibatis: DEBUG
?? 同樣需要替換為你的實際包路徑!
驗證配置是否生效
配置完成后,重啟應用程序,在 IDEA 控制臺應該能看到類似以下內容:
2025-10-19 15:30:45.123 DEBUG com.example.mapper.UserMapper.selectById - ==> Preparing: SELECT * FROM user WHERE id = ?
2025-10-19 15:30:45.125 DEBUG com.example.mapper.UserMapper.selectById - ==> Parameters: 123(Integer)
2025-10-19 15:30:45.130 DEBUG com.example.mapper.UserMapper.selectById - <== Total: 1
如果看到了,說明配置成功! ?
如果沒看到,請檢查:
- ? Mapper 包路徑是否正確
- ? 日志級別是否設置為 DEBUG
- ? 是否重啟了應用程序
- ? 是否在正確的 profile 中配置
完整配置示例(基于你的 ais-server 項目)
根據你提供的配置,這是一個完整的 logback-local.xml 示例:
<configuration>
<!-- 控制臺輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 文件輸出 -->
<appender name="syslog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/ais-server.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/ais-server.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Root Logger -->
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
<!-- 業務日志 -->
<logger name="com.torchv" level="DEBUG">
<appender-ref ref="syslog" />
</logger>
<!-- ===== Elasticsearch 日志配置 ===== -->
<!-- Elasticsearch Java Client 請求日志 -->
<logger name="org.elasticsearch.client" level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="syslog" />
</logger>
<!-- Spring Data Elasticsearch 查詢日志 -->
<logger name="org.springframework.data.elasticsearch" level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="syslog" />
</logger>
<!-- Elasticsearch RestClient 詳細日志 -->
<logger name="org.elasticsearch.client.RestClient" level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="syslog" />
</logger>
<!-- Elasticsearch 請求追蹤(最詳細) -->
<logger name="tracer" level="TRACE">
<appender-ref ref="STDOUT" />
<appender-ref ref="syslog" />
</logger>
<!-- ===== MyBatis SQL 日志配置 ===== -->
<!-- MyBatis Mapper 日志(請替換為你的實際包路徑) -->
<logger name="com.torchv.application.mapper" level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="syslog" />
</logger>
<!-- MyBatis Plus 日志(如果使用) -->
<logger name="com.baomidou.mybatisplus" level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="syslog" />
</logger>
</configuration>
對應的 application.yml 配置:
# 日志配置
logging:
level:
# Elasticsearch 客戶端日志
org.elasticsearch.client: DEBUG
org.elasticsearch.client.RestClient: DEBUG
# Spring Data Elasticsearch
org.springframework.data.elasticsearch: DEBUG
org.springframework.data.elasticsearch.client.elc: DEBUG
# HTTP 追蹤
tracer: TRACE
# MyBatis Mapper 日志
com.torchv.application.mapper: DEBUG
# MyBatis Plus
com.baomidou.mybatisplus: DEBUG
?? 使用場景
場景 1:優化 Elasticsearch 查詢性能
問題: 向量檢索很慢,不知道是哪里的問題。
解決方案:
- 打開 ES DSL Monitor
- 執行向量檢索操作
- 在監控窗口查看實際的 DSL 查詢
- 檢查:
num_candidates是否設置合理?k值是否過大?- 是否有不必要的
bool查詢? - 向量維度是否正確?
- 復制 DSL 到 Kibana 進行調優測試
- 修改代碼,再次驗證
效果: 查詢性能提升 3 倍! ??
場景 2:排查 N+1 查詢問題
問題: 列表接口很慢,懷疑有 N+1 查詢。
解決方案:
-
打開 SQL Monitor
-
調用列表接口
-
在監控窗口查看 SQL 執行情況
-
發現:
SELECT * FROM order WHERE user_id = 1 -- 1 次 SELECT * FROM order_item WHERE order_id = 101 -- N 次 SELECT * FROM order_item WHERE order_id = 102 -- N 次 SELECT * FROM order_item WHERE order_id = 103 -- N 次 ... -
確認是 N+1 查詢問題
-
修改為使用
JOIN或批量查詢 -
再次驗證,只執行 1-2 條 SQL
效果: 接口響應時間從 2 秒降到 200 毫秒! ?
場景 3:追蹤 API 調用鏈路
問題: 某個 API 報錯了,不知道執行了哪些查詢。
解決方案:
- 打開 ES DSL Monitor 和 SQL Monitor
- 清空所有歷史記錄
- 調用出問題的 API
- 在監控窗口查看:
- 執行了哪些 SQL?
- 執行了哪些 ES 查詢?
- 參數是否正確?
- 哪一步出錯了?
- 定位問題根源
效果: 5 分鐘定位問題,而不是 2 小時! ??
場景 4:學習和理解 ORM 行為
問題: 不確定 MyBatis / Spring Data ES 生成的查詢是什么樣的。
解決方案:
- 打開對應的監控工具
- 執行各種操作
- 觀察生成的查詢
- 學習:
- 分頁是如何實現的?
- 排序是如何處理的?
- 復雜條件是如何轉換的?
- 關聯查詢是如何執行的?
效果: 快速掌握框架行為,寫出更高效的代碼! ??
場景 5:代碼審查和性能優化
問題: 需要審查同事的代碼,確保查詢合理。
解決方案:
- 運行同事的代碼
- 打開監控工具
- 執行各種操作
- 檢查:
- 是否有冗余查詢?
- 是否有慢查詢?
- 索引是否使用正確?
- 查詢邏輯是否合理?
- 提出優化建議
效果: 提升團隊代碼質量,避免性能問題上線! ???
? 常見問題
Q1: 為什么沒有捕獲到 ES 查詢?
A: 請檢查以下幾點:
-
? "啟用 ES 監聽"開關是否打開?
- 在 ES DSL Monitor 工具窗口頂部檢查
-
? 日志配置是否正確?
- 檢查
logback.xml或application.yml - 確認
tracer日志級別為TRACE - 確認日志輸出到控制臺(
STDOUT)
- 檢查
-
? 應用程序是否在 IDEA 中運行?
- 必須通過 IDEA 的 Run/Debug 啟動
- 外部啟動的應用無法監控
-
? 是否執行了 ES 查詢操作?
- 觸發一個會調用 ES 的功能
- 檢查控制臺是否有
curl開頭的日志
-
? 日志格式是否支持?
- 查看
docs/EsDslMonitor使用指南.md了解支持的格式
- 查看
調試方法:
在控制臺搜索 curl 或 tracer,如果找不到,說明日志配置未生效。
Q2: 為什么沒有捕獲到 SQL 查詢?
A: 請檢查以下幾點:
-
? "啟用 SQL 監聽"開關是否打開?
- 在 SQL Monitor 工具窗口頂部檢查
-
? 日志配置是否正確?
- 檢查 Mapper 包路徑是否正確
- 確認日志級別為
DEBUG - 確認日志輸出到控制臺
-
? 項目是否使用 MyBatis?
- SQL Monitor 目前只支持 MyBatis
- 不支持 JPA/Hibernate 原生日志(可能在未來版本支持)
-
? 是否執行了數據庫操作?
- 觸發一個會查詢數據庫的功能
- 檢查控制臺是否有
Preparing:日志
調試方法:
在控制臺搜索 Preparing: 或 Parameters:,如果找不到,說明日志配置未生效。
Q3: 向量數據太長,日志難以閱讀怎么辦?
A: ES DSL Monitor 已經優化了向量數據的顯示:
- ? 自動截斷:向量數據會自動截斷顯示
- ? 折疊顯示:可以折疊/展開向量字段
- ? 復制功能:可以單獨復制 DSL(不包含向量)
如果仍然覺得太長,可以:
- 在詳情面板中查看(更清晰)
- 使用搜索功能過濾
- 導出到文件后用編輯器查看
Q4: API 路徑顯示 "N/A" 怎么辦?
A: API 路徑是通過解析日志中的上下文信息獲取的。如果顯示 "N/A",可能是:
-
日志中沒有 API 路徑信息
-
在 Controller 中添加日志:
@GetMapping("/api/user/list") public Result list() { log.info("API:/api/user/list"); // 添加這行 // ... }
-
-
API 日志和查詢日志間隔太遠
- 緩沖區大小有限,如果間隔太遠可能無法關聯
- 建議在查詢前后都打印日志
-
日志格式不匹配
- 確保日志包含
API:或URI:關鍵詞 - 支持的格式:
API:/api/user/listURI:/api/user/listRequest URI: /api/user/list
- 確保日志包含
Q5: 監控工具會影響性能嗎?
A: 幾乎不會!
性能優化措施:
- ? 異步處理:所有解析都在后臺線程執行
- ? 智能過濾:只處理相關日志,過濾無關內容
- ? 緩沖優化:合理的緩沖區大小,避免內存溢出
- ? 去重機制:避免重復記錄占用資源
- ? 自動清理:超過 1000 條自動清理舊記錄
性能測試結果:
- CPU 占用:< 1%
- 內存占用:< 50MB
- 對應用性能影響:可忽略不計
建議:
- 開發環境:始終開啟
- 生產環境:不需要(插件只在 IDEA 中運行)
Q6: 可以同時監控 ES 和 SQL 嗎?
A: 當然可以!而且互不干擾!
技術保障:
- ? 獨立監聽器:ES 和 SQL 使用不同的監聽器
- ? 智能過濾:ES Monitor 過濾掉 SQL 日志,SQL Monitor 過濾掉 ES 日志
- ? 獨立存儲:數據分別存儲在不同的文件
- ? 獨立 UI:兩個獨立的工具窗口
最佳實踐:
同時打開兩個監控窗口,全面掌握應用的數據訪問情況!
Q7: 日志太多,影響性能怎么辦?
A: 有幾種解決方案:
方案 1:只在需要時啟用
# application-dev.yml(開發環境)
logging:
level:
tracer: TRACE
com.yourpackage.mapper: DEBUG
# application-prod.yml(生產環境)
logging:
level:
tracer: INFO # 關閉詳細日志
com.yourpackage.mapper: INFO
方案 2:使用環境變量控制
logging:
level:
tracer: ${ES_LOG_LEVEL:INFO} # 默認 INFO,需要時改為 TRACE
com.yourpackage.mapper: ${SQL_LOG_LEVEL:INFO}
啟動時:
java -jar app.jar --ES_LOG_LEVEL=TRACE --SQL_LOG_LEVEL=DEBUG
方案 3:使用獨立的日志文件
<!-- 單獨的 ES 日志文件 -->
<appender name="ES_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/elasticsearch.log</File>
<!-- ... -->
</appender>
<logger name="tracer" level="TRACE" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="ES_LOG" /> <!-- 同時輸出到文件 -->
</logger>
Q8: 可以導出查詢記錄嗎?
A: 可以!支持多種導出方式:
方式 1:導出單條記錄
- 在表格中選中一條記錄
- 點擊 "導出選中" 按鈕
- 記錄已復制到剪貼板
- 粘貼到任何地方
方式 2:復制可執行 SQL/DSL
- 選中記錄,查看詳情
- 點擊 "復制 SQL" 或 "復制 DSL"
- 直接粘貼到數據庫工具或 Kibana
方式 3:批量導出(手動)
查詢記錄保存在:
- ES:
.idea/es-dsl-records.json - SQL:
.idea/sql-records.json
可以直接復制這些文件進行備份或分析。
?? 技術原理
工作原理概述
┌─────────────────────────────────────────────────────────────┐
│ 你的應用程序 │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Controller │ │ Service │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ │ ① 調用 │ ② 執行查詢 │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Mapper │ │ ES Template │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ │ ③ 輸出日志 │ ③ 輸出日志 │
│ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ IDEA 控制臺 (Console) │ │
│ │ ==> Preparing: SELECT ... │ │
│ │ curl -X POST "localhost:9200/..." │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
│ ④ 監聽控制臺輸出
▼
┌─────────────────────────────────────────────────────────────┐
│ PandaCoder 插件 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ ExecutionManager (進程管理器) │ │
│ │ 監聽應用啟動/停止,獲取 ProcessHandler │ │
│ └────────────────────┬─────────────────────────────────┘ │
│ │ ⑤ 附加監聽器 │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ ProcessListener (進程監聽器) │ │
│ │ ? EsDslOutputListener │ │
│ │ ? SqlOutputListener │ │
│ │ 逐行接收控制臺文本 │ │
│ └────────────────────┬─────────────────────────────────┘ │
│ │ ⑥ 智能過濾和緩沖 │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Parser (解析器) │ │
│ │ ? EsDslParser: 解析 ES 查詢 │ │
│ │ ? SqlParser: 解析 SQL 查詢 │ │
│ │ 提取關鍵信息(方法、索引、表名、參數等) │ │
│ └────────────────────┬─────────────────────────────────┘ │
│ │ ⑦ 保存記錄 │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ RecordService (記錄服務) │ │
│ │ ? 去重 │ │
│ │ ? 持久化 (JSON) │ │
│ │ ? 通知 UI 更新 │ │
│ └────────────────────┬─────────────────────────────────┘ │
│ │ ⑧ 實時更新 │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ ToolWindow (工具窗口) │ │
│ │ ? 表格展示 │ │
│ │ ? 詳情面板 │ │
│ │ ? 搜索/過濾/導出 │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
核心技術點
1. 進程監聽機制
// 監聽應用啟動事件
ApplicationManager.getApplication().getMessageBus()
.connect(project)
.subscribe(ExecutionManager.EXECUTION_TOPIC, new ExecutionListener() {
@Override
public void processStarted(..., ProcessHandler handler) {
// 應用啟動時,自動附加監聽器
attachListener(handler);
}
});
關鍵點:
- 使用 IntelliJ Platform 的
ExecutionManagerAPI - 監聽所有運行配置的啟動/停止事件
- 自動附加/移除監聽器,無需手動操作
2. 控制臺輸出監聽
public class EsDslOutputListener implements ProcessListener {
@Override
public void onTextAvailable(ProcessEvent event, Key outputType) {
String text = event.getText(); // 逐行接收控制臺文本
// 智能過濾
if (shouldKeepText(text)) {
buffer.append(text); // 添加到緩沖區
}
// 檢測完整日志
if (shouldTriggerParse(text)) {
triggerAsyncParse(); // 異步解析
}
}
}
關鍵點:
- 實現
ProcessListener接口 - 逐行接收控制臺輸出
- 智能過濾無關日志
- 使用緩沖區處理跨行日志
3. 智能過濾算法
private boolean shouldKeepText(String text) {
String lowerText = text.toLowerCase();
// ES Monitor: 過濾掉 SQL 日志
if (lowerText.contains("basejdbclogger") ||
lowerText.contains("preparing:")) {
return false; // 不保留
}
// SQL Monitor: 過濾掉 ES 日志
if (lowerText.contains("requestlogger") ||
lowerText.contains("elasticsearch")) {
return false; // 不保留
}
// 保留相關日志
if (lowerText.contains("tracer") || // ES 日志
lowerText.contains("preparing:")) { // SQL 日志
return true;
}
return false;
}
關鍵點:
- ES 和 SQL 監聽器互相過濾對方的日志
- 避免誤判和重復記錄
- 提高解析效率
4. 異步解析
private void triggerAsyncParse() {
// 避免并發解析
if (!isParsing.compareAndSet(false, true)) {
return;
}
// 獲取緩沖區快照
final String bufferedText = buffer.toString();
// 在后臺線程異步解析
ApplicationManager.getApplication().executeOnPooledThread(() -> {
try {
parseAndSave(bufferedText);
} finally {
isParsing.set(false);
}
});
}
關鍵點:
- 使用
AtomicBoolean避免并發解析 - 在后臺線程執行,不阻塞 IDEA
- 使用快照避免緩沖區被修改
5. 智能去重
private boolean isDuplicate(EsDslRecord newRecord) {
long now = System.currentTimeMillis();
for (EsDslRecord existing : records) {
// 時間窗口檢查(5秒內)
if (now - existing.getTimestamp() > 5000) {
continue;
}
// 內容相似度檢查
if (isSimilar(newRecord, existing)) {
return true; // 重復
}
}
return false;
}
private boolean isSimilar(EsDslRecord r1, EsDslRecord r2) {
return r1.getMethod().equals(r2.getMethod()) &&
r1.getIndex().equals(r2.getIndex()) &&
r1.getEndpoint().equals(r2.getEndpoint()) &&
normalizeJson(r1.getDslQuery()).equals(normalizeJson(r2.getDslQuery()));
}
關鍵點:
- 時間窗口去重(5 秒內相同查詢只保留 1 條)
- 多維度相似度判斷
- 忽略空白字符差異
6. 持久化存儲
private void saveToFile() {
try {
String json = objectMapper.writerWithDefaultPrettyPrinter()
.writeValueAsString(records);
File file = new File(project.getBasePath(), ".idea/es-dsl-records.json");
Files.writeString(file.toPath(), json, StandardCharsets.UTF_8);
} catch (Exception e) {
LOG.error("Failed to save records", e);
}
}
關鍵點:
- 使用 JSON 格式存儲
- 保存在項目的
.idea目錄 - 自動加載歷史記錄
?? 總結
為什么選擇 PandaCoder 的監控工具?
? 對比其他方案
| 特性 | PandaCoder | MyBatis Log Plugin | 手動打印日志 | 數據庫工具 |
|---|---|---|---|---|
| ES 查詢監控 | ? 完美支持 | ? 不支持 | ?? 需要手動 | ? 不支持 |
| SQL 查詢監控 | ? 完美支持 | ? 支持 | ?? 需要手動 | ?? 事后分析 |
| API 關聯 | ? 自動關聯 | ? 不支持 | ?? 需要手動 | ? 不支持 |
| 實時監控 | ? 實時 | ? 實時 | ?? 需要查看日志 | ? 事后 |
| 零代碼侵入 | ? 零侵入 | ? 零侵入 | ? 需要修改代碼 | ? 零侵入 |
| 可執行 SQL/DSL | ? 一鍵復制 | ? 一鍵復制 | ?? 需要手動拼接 | ? 支持 |
| 歷史記錄 | ? 自動保存 | ?? 有限 | ? 不保存 | ? 保存 |
| 性能影響 | ? 幾乎無 | ? 幾乎無 | ?? 有影響 | ? 無影響 |
?? 核心優勢
-
一站式解決方案
- 同時支持 ES 和 SQL 監控
- 無需安裝多個插件
-
智能化
- 自動過濾無關日志
- 智能去重
- 自動關聯 API
-
開發友好
- 零代碼侵入
- 一鍵復制可執行查詢
- 實時更新
-
性能優異
- 異步處理
- 智能緩沖
- 幾乎零性能損耗
-
持續更新
- 活躍維護
- 持續優化
- 社區支持
?? 獲取幫助
遇到問題?
-
查看日志
Help→Show Log in Explorer- 搜索
[ES DSL]或[SQL Monitor]
-
聯系作者
- ?? Email: yixiaoshu88@163.com
- ?? Website: https://www.shuyixiao.cn
- ?? GitHub Issues: 提交問題
反饋建議
我們歡迎任何反饋和建議!
- ? 如果覺得好用,請給項目點個 Star
- ?? 發現 Bug?請提交 Issue
- ?? 有新想法?歡迎 Pull Request
?? 開始使用吧!
現在你已經了解了 ES DSL Monitor 和 SQL Monitor 的所有功能和配置方法。
立即行動:
- ? 按照配置指南配置日志
- ? 重啟應用程序
- ? 打開監控工具窗口
- ? 開始享受可視化監控的便利!
記住:
- ?? ES 需要配置
tracer日志為TRACE - ?? SQL 需要配置 Mapper 包路徑為
DEBUG - ?? 兩個監控可以同時使用,互不干擾
祝你開發愉快! ??
PandaCoder - 讓中文開發者的編程更高效!
文檔版本:v2.0.0
更新時間:2025-10-19
作者:舒一笑不禿頭

浙公網安備 33010602011771號