倎囟

🚀 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参数已替换的 SQLSELECT * 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. 䌘化慢查询

🚀 快速匀始

第䞀步安装插件

  1. 打匀 IntelliJ IDEA
  2. Settings → Plugins → 搜玢 PandaCoder
  3. 点击 Install 安装
  4. 重启 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.clientDEBUG蟓出 ES 客户端基础日志⭐⭐⭐ 掚荐
org.elasticsearch.client.RestClientDEBUG蟓出 HTTP 请求/响应⭐⭐⭐⭐ 重芁
org.springframework.data.elasticsearchDEBUGSpring Data ES 查询日志⭐⭐⭐ 掚荐
tracerTRACE蟓出完敎的 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": {...}}'

劂果看到了诎明配眮成功 ✅

劂果没看到请检查

  1. ❌ 配眮文件路埄是吊正确
  2. ❌ 日志级别是吊讟眮䞺 TRACE
  3. ❌ 是吊重启了应甚皋序
  4. ❌ 是吊圚正确的 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 名称诎明掚荐床
方匏 Acom.yourpackage.mapper只蟓出䜠的 Mapper 接口的 SQL⭐⭐⭐⭐⭐ 最掚荐
方匏 Bcom.baomidou.mybatisplusMyBatis Plus 的 SQL⭐⭐⭐⭐ 掚荐
方匏 Corg.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

劂果看到了诎明配眮成功 ✅

劂果没看到请检查

  1. ❌ Mapper 包路埄是吊正确
  2. ❌ 日志级别是吊讟眮䞺 DEBUG
  3. ❌ 是吊重启了应甚皋序
  4. ❌ 是吊圚正确的 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 查询性胜

问题 向量检玢埈慢䞍知道是哪里的问题。

解决方案

  1. 打匀 ES DSL Monitor
  2. 执行向量检玢操䜜
  3. 圚监控窗口查看实际的 DSL 查询
  4. 检查

    • num_candidates 是吊讟眮合理
    • k 倌是吊过倧
    • 是吊有䞍必芁的 bool 查询
    • 向量绎床是吊正确
  5. 倍制 DSL 到 Kibana 进行调䌘测试
  6. 修改代码再次验证

效果 查询性胜提升 3 倍 🚀


场景 2排查 N+1 查询问题

问题 列衚接口埈慢怀疑有 N+1 查询。

解决方案

  1. 打匀 SQL Monitor
  2. 调甚列衚接口
  3. 圚监控窗口查看 SQL 执行情况
  4. 发现

    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 次
    ...
  5. 确讀是 N+1 查询问题
  6. 修改䞺䜿甚 JOIN 或批量查询
  7. 再次验证只执行 1-2 条 SQL

效果 接口响应时闎从 2 秒降到 200 毫秒 ⚡


场景 3远螪 API 调甚铟路

问题 某䞪 API 报错了䞍知道执行了哪些查询。

解决方案

  1. 打匀 ES DSL Monitor 和 SQL Monitor
  2. 枅空所有历史记圕
  3. 调甚出问题的 API
  4. 圚监控窗口查看

    • 执行了哪些 SQL
    • 执行了哪些 ES 查询
    • 参数是吊正确
    • 哪䞀步出错了
  5. 定䜍问题根源

效果 5 分钟定䜍问题而䞍是 2 小时 🎯


场景 4孊习和理解 ORM 行䞺

问题 䞍确定 MyBatis / Spring Data ES 生成的查询是什么样的。

解决方案

  1. 打匀对应的监控工具
  2. 执行各种操䜜
  3. 观察生成的查询
  4. 孊习

    • 分页是劂䜕实现的
    • 排序是劂䜕倄理的
    • 倍杂条件是劂䜕蜬换的
    • 关联查询是劂䜕执行的

效果 快速掌握框架行䞺写出曎高效的代码 📚


场景 5代码审查和性胜䌘化

问题 需芁审查同事的代码确保查询合理。

解决方案

  1. 运行同事的代码
  2. 打匀监控工具
  3. 执行各种操䜜
  4. 检查

    • 是吊有冗䜙查询
    • 是吊有慢查询
    • 玢匕是吊䜿甚正确
    • 查询逻蟑是吊合理
  5. 提出䌘化建议

效果 提升团队代码莚量避免性胜问题䞊线 🛡


❓ 垞见问题

Q1: 䞺什么没有捕获到 ES 查询

A: 请检查以䞋几点

  1. ✅ "启甚 ES 监听"匀关是吊打匀

    • 圚 ES DSL Monitor 工具窗口顶郚检查
  2. ✅ 日志配眮是吊正确

    • 检查 logback.xml 或 application.yml
    • 确讀 tracer 日志级别䞺 TRACE
    • 确讀日志蟓出到控制台STDOUT
  3. ✅ 应甚皋序是吊圚 IDEA 䞭运行

    • 必须通过 IDEA 的 Run/Debug 启劚
    • 倖郚启劚的应甚无法监控
  4. ✅ 是吊执行了 ES 查询操䜜

    • 觊发䞀䞪䌚调甚 ES 的功胜
    • 检查控制台是吊有 curl 匀倎的日志
  5. ✅ 日志栌匏是吊支持

    • 查看 docs/EsDslMonitor䜿甚指南.md 了解支持的栌匏

调试方法

圚控制台搜玢 curl 或 tracer劂果扟䞍到诎明日志配眮未生效。


Q2: 䞺什么没有捕获到 SQL 查询

A: 请检查以䞋几点

  1. ✅ "启甚 SQL 监听"匀关是吊打匀

    • 圚 SQL Monitor 工具窗口顶郚检查
  2. ✅ 日志配眮是吊正确

    • 检查 Mapper 包路埄是吊正确
    • 确讀日志级别䞺 DEBUG
    • 确讀日志蟓出到控制台
  3. ✅ 项目是吊䜿甚 MyBatis

    • SQL Monitor 目前只支持 MyBatis
    • 䞍支持 JPA/Hibernate 原生日志可胜圚未来版本支持
  4. ✅ 是吊执行了数据库操䜜

    • 觊发䞀䞪䌚查询数据库的功胜
    • 检查控制台是吊有 Preparing: 日志

调试方法

圚控制台搜玢 Preparing: 或 Parameters:劂果扟䞍到诎明日志配眮未生效。


Q3: 向量数据倪长日志隟以阅读怎么办

A: ES DSL Monitor 已经䌘化了向量数据的星瀺

  1. ✅ 自劚截断向量数据䌚自劚截断星瀺
  2. ✅ 折叠星瀺可以折叠/展匀向量字段
  3. ✅ 倍制功胜可以单独倍制 DSL䞍包含向量

劂果仍然觉埗倪长可以

  • 圚诊情面板䞭查看曎枅晰
  • 䜿甚搜玢功胜过滀
  • 富出到文件后甚猖蟑噚查看

Q4: API 路埄星瀺 "N/A" 怎么办

A: API 路埄是通过解析日志䞭的䞊䞋文信息获取的。劂果星瀺 "N/A"可胜是

  1. 日志䞭没有 API 路埄信息

    • 圚 Controller 䞭添加日志

      @GetMapping("/api/user/list")
      public Result list() {
          log.info("API:/api/user/list");  // 添加这行
          // ...
      }
  2. API 日志和查询日志闎隔倪远

    • 猓冲区倧小有限劂果闎隔倪远可胜无法关联
    • 建议圚查询前后郜打印日志
  3. 日志栌匏䞍匹配

    • 确保日志包含 API: 或 URI: 关键词
    • 支持的栌匏

      • API:/api/user/list
      • URI:/api/user/list
      • Request URI: /api/user/list

Q5: 监控工具䌚圱响性胜吗

A: 几乎䞍䌚

性胜䌘化措斜

  1. ✅ 匂步倄理所有解析郜圚后台线皋执行
  2. ✅ 智胜过滀只倄理盞关日志过滀无关内容
  3. ✅ 猓冲䌘化合理的猓冲区倧小避免内存溢出
  4. ✅ 去重机制避免重倍记圕占甚资源
  5. ✅ 自劚枅理超过 1000 条自劚枅理旧记圕

性胜测试结果

  • CPU 占甚< 1%
  • 内存占甚< 50MB
  • 对应甚性胜圱响可応略䞍计

建议

  • 匀发环境始终匀启
  • 生产环境䞍需芁插件只圚 IDEA 䞭运行

Q6: 可以同时监控 ES 和 SQL 吗

A: 圓然可以而䞔互䞍干扰

技术保障

  1. ✅ 独立监听噚ES 和 SQL 䜿甚䞍同的监听噚
  2. ✅ 智胜过滀ES Monitor 过滀掉 SQL 日志SQL Monitor 过滀掉 ES 日志
  3. ✅ 独立存傚数据分别存傚圚䞍同的文件
  4. ✅ 独立 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富出单条记圕

  1. 圚衚栌䞭选䞭䞀条记圕
  2. 点击 "富出选䞭" 按钮
  3. 记圕已倍制到剪莎板
  4. 粘莎到任䜕地方

方匏 2倍制可执行 SQL/DSL

  1. 选䞭记圕查看诊情
  2. 点击 "倍制 SQL" 或 "倍制 DSL"
  3. 盎接粘莎到数据库工具或 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 的 ExecutionManager API
  • 监听所有运行配眮的启劚/停止事件
  • 自劚附加/移陀监听噚无需手劚操䜜
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 的监控工具

✅ 对比其他方案
特性PandaCoderMyBatis Log Plugin手劚打印日志数据库工具
ES 查询监控✅ 完矎支持❌ 䞍支持⚠ 需芁手劚❌ 䞍支持
SQL 查询监控✅ 完矎支持✅ 支持⚠ 需芁手劚⚠ 事后分析
API 关联✅ 自劚关联❌ 䞍支持⚠ 需芁手劚❌ 䞍支持
实时监控✅ 实时✅ 实时⚠ 需芁查看日志❌ 事后
零代码䟵入✅ 零䟵入✅ 零䟵入❌ 需芁修改代码✅ 零䟵入
可执行 SQL/DSL✅ 䞀键倍制✅ 䞀键倍制⚠ 需芁手劚拌接✅ 支持
历史记圕✅ 自劚保存⚠ 有限❌ 䞍保存✅ 保存
性胜圱响✅ 几乎无✅ 几乎无⚠ 有圱响✅ 无圱响
🏆 栞心䌘势
  1. 䞀站匏解决方案

    • 同时支持 ES 和 SQL 监控
    • 无需安装倚䞪插件
  2. 智胜化

    • 自劚过滀无关日志
    • 智胜去重
    • 自劚关联 API
  3. 匀发友奜

    • 零代码䟵入
    • 䞀键倍制可执行查询
    • 实时曎新
  4. 性胜䌘匂

    • 匂步倄理
    • 智胜猓冲
    • 几乎零性胜损耗
  5. 持续曎新

    • 掻跃绎技
    • 持续䌘化
    • 瀟区支持

📞 获取垮助

遇到问题

  1. 查看日志

    • Help → Show Log in Explorer
    • 搜玢 [ES DSL] 或 [SQL Monitor]
  2. 联系䜜者

反銈建议

我们欢迎任䜕反銈和建议

  • ⭐ 劂果觉埗奜甚请给项目点䞪 Star
  • 🐛 发现 Bug请提亀 Issue
  • 💡 有新想法欢迎 Pull Request

🎊 匀始䜿甚吧

现圚䜠已经了解了 ES DSL Monitor 和 SQL Monitor 的所有功胜和配眮方法。

立即行劚

  1. ✅ 按照配眮指南配眮日志
  2. ✅ 重启应甚皋序
  3. ✅ 打匀监控工具窗口
  4. ✅ 匀始享受可视化监控的䟿利

记䜏

  • 📝 ES 需芁配眮 tracer 日志䞺 TRACE
  • 📝 SQL 需芁配眮 Mapper 包路埄䞺 DEBUG
  • 📝 䞀䞪监控可以同时䜿甚互䞍干扰

祝䜠匀发愉快 🚀

PandaCoder - 让䞭文匀发者的猖皋曎高效


文档版本v2.0.0
曎新时闎2025-10-19
䜜者舒䞀笑䞍秃倎


舒䞀笑䞍秃倎
43 声望127 粉䞝

IDEA插件-PandaCoder工具宇宙䜜è€