[JAVA] Geben Sie den HTTP-Header des zu protokollierenden Google-http-Clients aus

Es beantwortet die Notwendigkeit, den von der GCP-Clientbibliothek ausgegebenen HTTP-Anforderungsheader / Antwortheader zu protokollieren.

Nachtrag: Mir ist aufgefallen, dass es eine Beschreibung in der Hauptfamilie gibt. Der Inhalt ist fast der gleiche wie in diesem Memo, aber ich denke, Sie sollten sich die ursprüngliche Website ansehen. https://googleapis.github.io/google-http-java-client/http-transport.html

Wenn Sie nur den Anforderungsheader protokollieren möchten (den Text nicht ausgeben möchten), ist dieser Artikel hilfreich. (Ende des Postskripts)


Vorläufige Nachforschung

google-http-client scheint JUL (Java Util Logging) zu verwenden.

Aus diesem Grund habe ich hinzugefügt, dass, wenn ich die Protokollstufe für den Logger von HttpTransport auf CONFIG setze, sie anscheinend ausgegeben werden kann.

Versuchen Sie sich anzumelden

Es gibt zwei Arten von Protokollierungsansätzen.

Ansatz 1: Ausgabe in logging.properties

JUL kann in einer Datei festgelegt werden. Versuchen wir also zuerst diesen Ansatz.

Referenz: https://docs.oracle.com/javase/jp/8/docs/api/java/util/logging/LogManager.html

Erstellen Sie eine Konfigurationsdatei logging.properties.

logging.properties


handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=CONFIG
com.google.api.client.http.HttpTransport.level=CONFIG

Versuchen Sie, die Systemeigenschaften "java.util.logging.config.file" mit dem Pfad zu "logging.properties" (dem Pfad im Dateisystem) auszuführen.

Dies ist der auszuführende Code. (Eine Liste der Cloud-Speicher-Buckets abrufen)

final GoogleCredentials credentials = createCredentials();
final StorageOptions storageOptions = StorageOptions.newBuilder().setCredentials(credentials).build();
final Storage storage = storageOptions.getService();
final Page<Bucket> buckets = storage.list();
for (final Bucket bucket : buckets.iterateAll()) {
    System.out.println("bucket: " + bucket);
}

Ausgabeergebnis

Eine Anfrage / Antwort wurde an die Konsole ausgegeben. (Es stellte sich heraus, dass die Voruntersuchung korrekt war)

12. Juli, 2020 12:14:09 Uhr com.google.api.client.http.HttpRequest execute
Verfassung: -------------- REQUEST  --------------
GET https://storage.googleapis.com/storage/v1/b?project=xxxx&projection=full
Accept-Encoding: gzip
Authorization: <Not Logged>
User-Agent: (Abkürzung)


12. Juli, 2020 12:14:09 Uhr com.google.api.client.http.HttpRequest execute
Verfassung: curl -v --compressed -H 'Accept-Encoding: gzip' -H 'Authorization: <Not Logged>' -H 'User-Agent: (Abkürzung)
12. Juli, 2020 12:14:10 Uhr com.google.api.client.http.HttpResponse <init>
Verfassung: -------------- RESPONSE --------------
HTTP/1.1 200 OK
Alt-Svc: (Abkürzung)
Server: UploadServer
Cache-Control: private, max-age=0, must-revalidate, no-transform
X-GUploader-UploadID: (Abkürzung)
Vary: X-Origin
Vary: Origin
Expires: Sat, 11 Jul 2020 15:14:10 GMT
Content-Length: 3228
Date: Sat, 11 Jul 2020 15:14:10 GMT
Content-Type: application/json; charset=UTF-8


12. Juli, 2020 12:14:10 Uhr com.google.api.client.util.LoggingByteArrayOutputStream close
Verfassung: Total: 3,228 bytes
12. Juli, 2020 12:14:10 Uhr com.google.api.client.util.LoggingByteArrayOutputStream close
Verfassung: {
  "kind": "storage#buckets",
  "items": (Abkürzung)

Wenn Sie es auf diese Weise versuchen, werden Sie feststellen, was Sie anstreben und was Sie nicht erwartet haben.

Was war beabsichtigt

Die Anforderungs- und Antwortheader wurden erfolgreich ausgegeben.

Was ich nicht vorhatte

Ich möchte den Körper draußen halten, aber ich glaube nicht, dass er in der Einstellungsdatei ausgedrückt werden kann.

Ansatz 2: Programmgesteuerte Ausgabe

Als nächstes versuchen wir den programmgesteuerten Ansatz.

Weisen Sie den JUL-Logger auf die gleiche Weise wie in der vorherigen Konfigurationsdatei an.

import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpTransport;

(Abkürzung)

final Logger logger = Logger.getLogger(HttpTransport.class.getName());
logger.setLevel(Level.CONFIG);
//TODO füge Hander zurück(remove)Machen
logger.addHandler(new Handler() {
    @Override public void publish(final LogRecord record) {
        //Ich möchte diesmal nur den Header löschen(Ich möchte den Körper nicht löschen)Also nur HttpRequest und HttpResponse.
        final String sourceClassName = record.getSourceClassName();
        if (HttpRequest.class.getName().equals(sourceClassName) || HttpResponse.class.getName().equals(sourceClassName)) {
            final String date = DateTimeFormatter.ISO_INSTANT.format(Instant.ofEpochMilli(record.getMillis()));
            final String msg = "[" + logger.getLevel() + "] " + date + " " + record.getMessage();
            //Bitte gehen Sie zu TODOs eigenem Logger
            System.out.println(msg);
        }
    }

    @Override public void flush() {
    }

    @Override public void close() throws SecurityException {
    }
});

Ausgabeergebnis

Wenn ich denselben Code ausführe (einen Cloud-Speicher-Bucket erhalten) wie zuvor, Diesmal wird der Körper nicht mehr ausgegeben. (Obwohl die Zeichenfolge für Curl noch ausgegeben wird)

[CONFIG] 2020-07-11T13:37:42.844Z -------------- REQUEST  --------------
GET https://storage.googleapis.com/storage/v1/b?project=xxxx&projection=full
Accept-Encoding: gzip
Authorization: <Not Logged>
User-Agent: (Abkürzung)


[CONFIG] 2020-07-11T13:37:42.844Z curl -v --compressed -H 'Accept-Encoding: gzip' -H 'Authorization: <Not Logged>' -H 'User-Agent: (Abkürzung)
[CONFIG] 2020-07-11T13:37:43.536Z -------------- RESPONSE --------------
HTTP/1.1 200 OK
Alt-Svc: (Abkürzung)
Server: UploadServer
Cache-Control: private, max-age=0, must-revalidate, no-transform
X-GUploader-UploadID: (Abkürzung)
Vary: X-Origin
Vary: Origin
Expires: Sat, 11 Jul 2020 13:37:43 GMT
Content-Length: 3228
Date: Sat, 11 Jul 2020 13:37:43 GMT
Content-Type: application/json; charset=UTF-8

Impressionen

Ich habe zwei verschiedene Ansätze ausprobiert. Mein Anwendungsfall ist

--Fall, wo Sie nur den Header löschen möchten --Fall, wo Sie sowohl den Header als auch den Body löschen möchten

Da es zwei gibt, scheint der Ansatz der programmgesteuerten Ausgabe besser zu sein. (Im Codebeispiel im Artikel wird nur der Header ausgegeben, es ist jedoch nicht schwierig, ihn so zu ändern, dass sowohl der Header als auch der Body ausgegeben werden können.)

Wenn Sie jedoch nur den Header und den Body ausgeben möchten, ist der Ansatz der Konfigurationsdatei ausreichend.

Umgebung

Dies ist die Version, deren Funktion bestätigt wurde.

Recommended Posts

Geben Sie den HTTP-Header des zu protokollierenden Google-http-Clients aus
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Protokollausgabe in Datei in Java
Protokollausgabe der WebServiceTemplate-Anforderung / Antwort
So geben Sie Jetty-Protokolle in ein beliebiges Verzeichnis aus
Ausgabe des Buches "Einführung in Java"
Ausgabe der Verwendung der Slice-Methode
Format der Protokollausgabe von Tomcat selbst in Tomcat 8
So wenden Sie HandlerInterceptor auf das http-Inbound-Gateway von Spring Integration an
Konvertieren Sie das Array von error.full_messages in Zeichen und geben Sie es aus
Protokoll mit slf4j + Logback mit Maven in externe Datei ausgeben
Ich möchte die Protokollausgabe unter Android vereinfachen
Ausgabe in Vielfachen von 3
Geben Sie das integrierte Tomcat-Zugriffsprotokoll mit Spring Boot an die Standardausgabe aus
Wenn im Docker-Protokoll keine Ausgabe für stdout vorhanden ist
So beheben Sie das Problem, dass beim Stoppen der Webanwendung kein Protokollierungsprotokoll ausgegeben wird