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)
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.
Es gibt zwei Arten von Protokollierungsansätzen.
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);
}
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.
Die Anforderungs- und Antwortheader wurden erfolgreich ausgegeben.
HttpRequest
und HttpResponse
ausgegeben.logging.properties
angeben.)Ich möchte den Körper draußen halten, aber ich glaube nicht, dass er in der Einstellungsdatei ausgedrückt werden kann.
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 {
}
});
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
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.
Dies ist die Version, deren Funktion bestätigt wurde.
Recommended Posts