如何调试/查看olivere/elastic Go库生成的Elasticsearch查询?
获取olivere/elastic生成的实际JSON查询内容
方法1:自定义InfoLog提取请求体
SetTraceLog确实不会输出请求体,改用SetInfoLog并配合自定义日志处理器,可以直接提取发送给ES的JSON查询:
import ( "fmt" "log" "os" "strings" ) type customESLogger struct { inner *log.Logger } func (l *customESLogger) Printf(format string, v ...interface{}) { logMsg := fmt.Sprintf(format, v...) // 定位到请求体部分并单独输出 if bodyStart := strings.Index(logMsg, "body:"); bodyStart != -1 { l.inner.Println("实际查询JSON:", logMsg[bodyStart+5:]) } l.inner.Printf(format, v...) } // 创建客户端时配置自定义日志 client, err := elastic.NewClient( elastic.SetInfoLog(&customESLogger{inner: log.New(os.Stdout, "", 0)}), // 其他客户端配置... )
方法2:手动序列化查询对象
在执行查询前,直接将构建好的查询对象序列化为JSON,提前查看生成的查询内容:
import "encoding/json" // 构建你的查询逻辑 query := elastic.NewTermQuery("user", "olivere") // 序列化查询为JSON queryJSON, err := json.Marshal(query) if err != nil { log.Fatalf("序列化失败: %v", err) } log.Println("生成的查询JSON:", string(queryJSON)) // 正常执行查询 res, err := client.Search(). Index("test-index"). Query(query). Do(context.TODO())
方法3:开启Elasticsearch端请求日志
修改Elasticsearch的elasticsearch.yml配置,开启HTTP请求日志:
logger.org.elasticsearch.http: DEBUG
重启ES后,在其日志文件中可以看到所有接收到的完整请求内容,包含查询JSON。
内容的提问来源于stack exchange,提问作者Chris Stryczynski
相关产品推荐
相关产品推荐

