[JAVA] Sortie de l'en-tête HTTP de google-http-client à journaliser

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)


Recherche préliminaire

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é.

Essayez de vous connecter

Il existe deux types d'approches de journalisation.

Approche 1: sortie dans logging.properties

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);
}

Résultat de sortie

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.

Ce qui était prévu

Les en-têtes de demande et de réponse ont été générés avec succès.

Ce que je n'avais pas l'intention

Je veux garder le corps à l'extérieur, mais je ne pense pas que cela puisse être exprimé dans le fichier de paramètres.

Approche 2: sortie par programme

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 {
    }
});

Résultat de sortie

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

Impressions

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.

environnement

Il s'agit de la version dont le fonctionnement a été confirmé.

Recommended Posts

Sortie de l'en-tête HTTP de google-http-client à journaliser
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
Enregistrer la sortie dans un fichier en Java
Sortie du journal de la requête / réponse WebServiceTemplate
Comment générer des journaux Jetty dans n'importe quel répertoire
Sortie du livre "Introduction à Java"
Sortie de la façon d'utiliser la méthode slice
Format de la sortie du journal par Tomcat lui-même dans Tomcat 8
Comment appliquer HandlerInterceptor à la passerelle entrante http de Spring Integration
Convertit le tableau d'erreurs.full_messages en caractères et sortie
Journal de sortie vers un fichier externe avec slf4j + logback avec Maven
Je souhaite simplifier la sortie du journal sur Android
Sortie en multiples de 3
Sortez le journal d'accès Tomcat intégré à la sortie standard avec Spring Boot
Lorsqu'il n'y a pas de sortie vers stdout dans le journal du docker
Comment résoudre le problème de non-sortie du journal de connexion lorsque l'application Web est arrêtée