Il répond au besoin de consigner l'en-tête de la requête HTTP / l'en-tête de réponse émis par la bibliothèque cliente GCP.
Post-scriptum: J'ai remarqué qu'il y a une description dans la famille principale. Le contenu est presque le même que celui de ce mémo jusqu'à présent, mais je pense que vous devriez jeter un coup d'œil au site Web d'origine. https://googleapis.github.io/google-http-java-client/http-transport.html
Si vous souhaitez enregistrer uniquement l'en-tête de la demande (ne souhaitez pas afficher le corps), cet article vous sera utile. (Fin du post-scriptum)
google-http-client semble utiliser JUL (java util logging).
--L'enregistreur utilisé pour la sortie du journal est la constante LOGGER de la classe com.google.api.client.http.HttpTransport
. .36.0 / google-http-client / src / main / java / com / google / api / client / http / HttpTransport.java # L73).
--Il semble être une directive de se référer à la constante HttpTransport de chaque classe au lieu d'avoir un enregistreur pour chaque classe.
--Niveau du journal à [CONFIG](https://github.com/googleapis/google-http-java-client/blob/v1.36.0/google-http-client/src/main/java/com/google/api/ Si vous définissez client / http / HttpRequest.java # L891), il semble qu'un journal sera généré.
À partir de là, j'ai ajouté que si je définissais le niveau de journalisation sur CONFIG pour Logger of HttpTransport, il semble qu'il puisse être généré.
Il existe deux types d'approches de journalisation.
JUL peut être défini dans un fichier, alors essayons d'abord cette approche.
Référence: https://docs.oracle.com/javase/jp/8/docs/api/java/util/logging/LogManager.html
Créez un fichier de configuration logging.properties
.
logging.properties
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=CONFIG
com.google.api.client.http.HttpTransport.level=CONFIG
Essayez d'exécuter les propriétés système java.util.logging.config.file
avec le chemin vers logging.properties
(le chemin sur le système de fichiers).
C'est le code à exécuter. (Obtenez une liste des buckets Cloud Storage)
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);
}
Une demande / réponse a été envoyée à la console. (Il s'est avéré que l'enquête préliminaire était correcte)
12 juillet, 2020 12:14:09 h 00 com.google.api.client.http.HttpRequest execute
Constitution: -------------- REQUEST --------------
GET https://storage.googleapis.com/storage/v1/b?project=xxxx&projection=full
Accept-Encoding: gzip
Authorization: <Not Logged>
User-Agent: (Abréviation)
12 juillet, 2020 12:14:09 h 00 com.google.api.client.http.HttpRequest execute
Constitution: curl -v --compressed -H 'Accept-Encoding: gzip' -H 'Authorization: <Not Logged>' -H 'User-Agent: (Abréviation)
12 juillet, 2020 12:14:10 h 00 com.google.api.client.http.HttpResponse <init>
Constitution: -------------- RESPONSE --------------
HTTP/1.1 200 OK
Alt-Svc: (Abréviation)
Server: UploadServer
Cache-Control: private, max-age=0, must-revalidate, no-transform
X-GUploader-UploadID: (Abréviation)
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 juillet, 2020 12:14:10 h 00 com.google.api.client.util.LoggingByteArrayOutputStream close
Constitution: Total: 3,228 bytes
12 juillet, 2020 12:14:10 h 00 com.google.api.client.util.LoggingByteArrayOutputStream close
Constitution: {
"kind": "storage#buckets",
"items": (Abréviation)
Si vous essayez de cette façon, vous remarquerez à la fois ce que vous visez et ce à quoi vous ne vous attendiez pas.
Les en-têtes de demande et de réponse ont été générés avec succès.
LoggingByteArrayOutputStream
.HttpRequest
et HttpResponse
.
--La valeur de l'en-tête Authorization est abrégée en ʻAuthorization: logging.properties
)Je veux garder le corps à l'extérieur, mais je ne pense pas que cela puisse être exprimé dans le fichier de paramètres.
Ensuite, essayons l'approche définie par programme.
Indiquez le journal de JUL de la même manière que le fichier de configuration précédent.
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;
(Abréviation)
final Logger logger = Logger.getLogger(HttpTransport.class.getName());
logger.setLevel(Level.CONFIG);
//TODO ajouter Hander retour(remove)Faire
logger.addHandler(new Handler() {
@Override public void publish(final LogRecord record) {
//Je veux publier uniquement l'en-tête cette fois(Je ne veux pas éteindre le corps)Donc, seulement HttpRequest et 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();
//Veuillez vous rendre sur le propre enregistreur de TODO
System.out.println(msg);
}
}
@Override public void flush() {
}
@Override public void close() throws SecurityException {
}
});
Lorsque j'exécute le même code (pour obtenir un bucket Cloud Storage) qu'avant, Cette fois, le corps n'est plus sorti. (Bien que la chaîne de caractères pour curl soit toujours sortie)
[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: (Abréviation)
[CONFIG] 2020-07-11T13:37:42.844Z curl -v --compressed -H 'Accept-Encoding: gzip' -H 'Authorization: <Not Logged>' -H 'User-Agent: (Abréviation)
[CONFIG] 2020-07-11T13:37:43.536Z -------------- RESPONSE --------------
HTTP/1.1 200 OK
Alt-Svc: (Abréviation)
Server: UploadServer
Cache-Control: private, max-age=0, must-revalidate, no-transform
X-GUploader-UploadID: (Abréviation)
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
J'ai essayé deux approches différentes. Mon cas d'utilisation est
Puisqu'il y en a deux, l'approche de la sortie programmatique semble être meilleure. (Dans l'exemple de code de l'article, seul l'en-tête est affiché, mais il n'est pas difficile de le modifier pour que l'en-tête et le corps puissent être affichés.)
D'un autre côté, si vous souhaitez simplement afficher à la fois l'en-tête et le corps, l'approche du fichier de configuration est suffisante.
Il s'agit de la version dont le fonctionnement a été confirmé.
Recommended Posts