Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich generierte Abfragen debuggen/anzeigen, wenn ich die Bibliothek olivere/elastic elasticsearch go verwende?

Wie kann ich generierte Abfragen debuggen/anzeigen, wenn ich die Bibliothek olivere/elastic elasticsearch go verwende?

WBOY
WBOYnach vorne
2024-02-15 09:09:081105Durchsuche

使用 olivere/elastic elasticsearch go 库时如何调试/查看生成的查询?

Das Debuggen und Anzeigen der generierten Abfragen ist ein sehr wichtiger Schritt bei der Verwendung der olivere/elastic Elasticsearch Go-Bibliothek. Während der Entwicklung müssen wir häufig sicherstellen, dass die von uns erstellten Abfragen korrekt sind und die erwarteten Ergebnisse liefern. Der PHP-Editor Xinyi stellt Ihnen einige Methoden zum Debuggen und Anzeigen der generierten Abfragen vor, um sicherzustellen, dass Ihr Code ordnungsgemäß funktioniert. Ob in einer Entwicklungs- oder Produktionsumgebung, diese Tipps helfen Ihnen, Ihren Code besser zu verstehen und zu debuggen.

Frageninhalt

Ich versuche herauszufinden, was die von der https://github.com/olivere/elastic-Bibliothek generierte Abfrage ist, ähnlich der tatsächlichen JSON-Wertabfrage, die an den Elasticsearch-Server gesendet wird.

Es gibt einige Dokumentation zu Ablaufverfolgungsprotokollen (die, die ich verwendet habe, ist unten gezeigt), aber diese scheint keine Abfragen zu enthalten.

client, err := elastic.NewClient(
...
elastic.SetTraceLog(log.New(os.Stdout,"",0)),
)

Ich kann in der Dokumentation hier anscheinend auch nichts Relevantes finden: https://pkg.go.dev/github.com/olivere/elastic?utm_source=godoc

Workaround

Laut der Dokumentation können Sie sich selbst zur Verfügung stellen http-Client:

// Holen Sie sich den Kunden. Sie können hier auch Ihren eigenen http-Client bereitstellen.
Client, ähm := elastic.newclient(elastic.seterrorlog(errorlog))

Okay, das ist das Ende der Dokumentation :)...eigentlich muss man die doer Schnittstelle bereitstellen.
Ich habe eine Struktur instanziiert, die die doer 接口的结构,并装饰了 http.do()-Schnittstelle implementiert, und http.do() dekoriert, um den http.request-Dump zu protokollieren:

Haftungsausschluss: Im Rahmen dieser Frage ist dies nur ein minimales Beispiel dafür, was ich gegen eine elastische Instanz verwende, die in einem Docker-Container ausgeführt wird. Führen Sie in der Produktion keine unsicheren TLS aus, codieren Sie keine Anmeldeinformationen fest, konfigurieren Sie den HTTP-Transport nicht nach Bedarf usw.

package main

import (
    "context"
    "crypto/tls"
    "fmt"
    "net/http"
    "net/http/httputil"

    "github.com/olivere/elastic/v7"
)

type logginghttpelasticclient struct {
    c http.client
}

func (l logginghttpelasticclient) do(r *http.request) (*http.response, error) {
    // log the http request dump
    requestdump, err := httputil.dumprequest(r, true)
    if err != nil {
        fmt.println(err)
    }
    fmt.println("reqdump: " + string(requestdump))
    return l.c.do(r)
}

func main() {
    doer := logginghttpelasticclient{
        c: http.client{
            // load a trusted ca here, if running in production
            transport: &http.transport{
                tlsclientconfig: &tls.config{insecureskipverify: true},
            },
        },
    }

    client, err := elastic.newclient(
        // provide the logging doer here
        elastic.sethttpclient(doer),

        elastic.setbasicauth("elastic", "<password>"),
        elastic.seturl("https://<address>:9200"),
        elastic.setsniff(false), // this is specific to my docker elastic runtime
    )
    if err != nil {
        panic(err)
    }

    /*
        generate a random http request to check if it's logged
    */
    ac := client.alias()
    ac.add("myindex", "myalias").do(context.background())
}

Das ist die Ausgabe:

reqDump: POST /_aliases HTTP/1.1
Host: 127.0.0.1:9200
Accept: application/json
Authorization: Basic base64(<user>:<pass>)
Content-Type: application/json
User-Agent: elastic/7.0.32 (linux-amd64)

{"actions":[{"add":{"alias":"myAlias","index":"myIndex"}}]}

Ich ging davon aus, dass es auch möglich wäre, settracelog zu verwenden, habe mich aber für einen bekannten Weg entschieden.

Das obige ist der detaillierte Inhalt vonWie kann ich generierte Abfragen debuggen/anzeigen, wenn ich die Bibliothek olivere/elastic elasticsearch go verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen