Lire et écrire des journaux d'application

Aperçu

Lorsqu'une requête est envoyée à votre application, un journal de requêtes est automatiquement écrit par App Engine. Pendant le traitement de la requête, votre application peut également écrire des journaux d'application. Cette page explique comment écrire des journaux d'application depuis votre application, lire les journaux d'application et de requêtes par programmation à l'aide de l'API Logs, afficher les données de journalisation dans la console Google Cloud Platform et interpréter les données des journaux de requêtes écrites par App Engine à réception de la requête.

Journaux de requêtes et journaux d'application

Il existe deux catégories de données de journal : les journaux de requêtes et les journaux d'application. Un journal de requêtes est automatiquement écrit par App Engine pour chaque requête traitée par votre application. Il contient des informations telles que l'ID de projet, la version HTTP, etc. Pour obtenir une liste complète des propriétés des journaux de requêtes disponibles, consultez la section Journaux de requêtes. Vous trouverez également une description des champs de journal de requêtes à la section Table de journalisation des requêtes.

Chaque journal de requêtes contient une liste de journaux d'application (AppLogLine) associés à cette requête, renvoyés par la méthode RequestLogs.getAppLogLines(). Chaque journal d'application contient l'heure d'écriture du journal, ainsi que le message et le niveau de journal.

Écrire des journaux d'application

Le SDK App Engine pour Java permet à un développeur d'enregistrer les niveaux de gravité suivants :

  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

Les niveaux INFO, WARNING et SEVERE apparaissent dans les journaux sans nécessiter de configuration supplémentaire. Pour ajouter d'autres niveaux de journalisation à votre application Java, vous devez ajouter les propriétés système adéquates dans le fichier appengine-web.xml de votre projet. Vous pouvez également être amené à modifier le fichier logging.properties pour définir le niveau de journalisation souhaité. Ces deux fichiers sont générés lorsque vous créez un nouveau projet App Engine Java à l'aide de Maven. Vous pouvez trouver ces fichiers aux emplacements suivants :

Arborescence projet de Maven

Pour ajouter des niveaux de journalisation autres que INFO, WARNING ou SEVERE, modifiez le fichier appengine-web.xml pour ajouter les éléments suivants dans les balises <appengine-web-app> :

    <system-properties>
       <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>

Le niveau de journalisation renseigné par défaut dans logging.properties est INFO. Pour modifier le niveau de journalisation par défaut pour toutes les classes de votre application, changez le niveau renseigné dans le fichier logging.properties. Par exemple, vous pouvez passer de .level = INFO à.level = WARNING.

Dans le code de l'application, écrivez des messages de journalisation au moyen de l'API java.util.logging.Logger. L'exemple ci-dessous écrit un message de journalisation de niveau Info :

import java.util.logging.Logger;
//...

public class MyClass {

  private static final Logger log = Logger.getLogger(MyClass.class.getName());
  log.info("Your information log message.");
  //....

À l'exécution de votre application, App Engine enregistre les messages et les rend disponibles. Vous pouvez les lire par programme à l'aide de l'API Logs, comme illustré ci-après, ou vous pouvez les parcourir dans la visionneuse de journaux.

Format d'URL de journal dans la console Google Cloud Platform

Voici un exemple d'URL présentant le format d'URL de journal tel qu'il apparaît dans la console GCP :

https://console.cloud.google.com/logs?filters=request_id:000000db00ff00ff827e493472570001737e73686966746361727331000168656164000100

Lire des journaux dans la console

Pour afficher les journaux écrits par les applications exécutées dans l'environnement standard, utilisez la visionneuse de journaux.

Pour filtrer les entrées de journal par libellé ou élément de texte dans la visionneuse de journaux, consultez la section Filtres de journaux de base. Pour créer des filtres de journaux avancés à l'aide d'expressions spécifiant un ensemble d'entrées à partir d'un nombre quelconque de journaux, consultez la page Filtres de journaux avancés.

Un journal classique d'App Engine contient des données au format de journal combiné Apache, ainsi que des champs App Engine spéciaux, comme le montre l'exemple de journal ci-dessous :

192.0.2.0 - test [27/Jun/2014:09:11:47 -0700] "GET / HTTP/1.1" 200 414
"http://www.example.com/index.html"
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
"1-dot-calm-sylph-602.appspot.com" ms=195 cpu_ms=42 cpm_usd=0.000046
loading_request=1 instance=00c61b117cfeb66f973d7df1b7f4ae1f064d app_engine_release=1.9.76

Comprendre les champs de journal de requêtes

Le tableau suivant répertorie les champs par ordre d’occurrence et leur description :

Numéro de champ Nom du champ Toujours présent ? Description
1 Adresse du client Oui Adresse IP du client. Exemple : 192.0.2.0
2 Identité RFC 1413 Non Identité RFC 1413 du client, presque toujours le caractère "-"
3 Utilisateur Non Présent uniquement si l'application utilise l'API Users et que l'utilisateur est connecté. Cette valeur correspond à la partie "pseudo" du compte Google. Par exemple, si le compte Google est test@example.com, le pseudo enregistré dans ce champ est test.
4 Horodatage Oui Demander un horodatage. Exemple : [27/Jun/2014:09:11:47 -0700]
5 Demander une chaîne de requête Oui Première ligne de la requête contenant la méthode, le chemin et la version HTTP. Exemple : GET / HTTP/1.1
6 Code d'état HTTP Oui Code d'état HTTP renvoyé. Exemple : 200
7 Taille d'une réponse Oui Taille de réponse en octets. Exemple : 414
8 Chemin de l'URL de provenance Non En l'absence d'URL de provenance, le journal ne contient aucun chemin, seulement le caractère "-". Exemple de chemin d'URL de provenance : "http://www.example.com/index.html".
9 User-agent Oui Identifie le navigateur et le système d'exploitation sur le serveur Web. Exemple : Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
10 Nom d'hôte Oui Nom d'hôte utilisé par le client pour se connecter à l'application App Engine. Exemple : (1-dot-calm-sylph-602.appspot.com)
11 Durée d'exécution Oui Temps total en millisecondes passé par App Engine sur la requête. Cette durée n'inclut pas le temps passé entre le client et le serveur qui exécute l'instance de votre application. Exemple : ms=195.
12 Durée d'utilisation du processeur en millisecondes Oui Nombre de millisecondes nécessaires au processeur pour répondre à la requête, c'est-à-dire le temps passé à exécuter le code de votre application, par référence à un processeur Intel x86 de 1,2 GHz. Si le processeur réellement utilisé est plus rapide que celui de référence, la durée d'utilisation du processeur en millisecondes peut être supérieure à la durée d'exécution réelle définie ci-dessus. Exemple : cpu_ms=42
13 Code de sortie Non Présent uniquement si l'instance a été arrêtée après réception de la requête. Au format exit_code=XXX, où XXX est un nombre à 3 chiffres correspondant au motif d'arrêt de l'instance. Les codes de sortie ne sont pas documentés, car ils sont principalement destinés à aider Google à détecter et à résoudre les problèmes.
14 Coût estimé Oui OBSOLÈTE. Coût estimé de 1 000 requêtes de ce type, en USD. Exemple : cpm_usd=0.000046
15 Nom de la file d'attente Non Nom de la file d'attente de tâches utilisée. Présent uniquement si la requête utilise une file d'attente de tâches. Exemple : queue_name=default
16 Nom de la tâche Non Nom de la tâche exécutée dans la file d'attente de cette requête. Présent uniquement si la requête entraîne la mise en file d'attente d'une tâche. Exemple : task_name=7287390692361099748
17 File d'attente Non Présent uniquement si une requête a passé un certain temps dans une file d'attente. Si ces requêtes sont nombreuses dans vos journaux et/ou si les valeurs sont élevées, cela peut indiquer qu'il vous faut davantage d'instances pour distribuer votre trafic. Exemple : pending_ms=195
18 Requête de chargement Non Présent uniquement s'il s'agit d'une requête de chargement, c'est-à-dire qu'une instance a dû être démarrée. Dans l'idéal, vos instances doivent être opérationnelles et en bon état le plus longtemps possible afin de répondre à un grand nombre de requêtes avant d'être recyclées et de devoir être redémarrées. Ces requêtes ne devraient donc pas figurer en nombre dans vos journaux. Exemple : loading_request=1.
19 Instance Oui Identifiant unique de l'instance qui gère la requête. Exemple : instance=00c61b117cfeb66f973d7df1b7f4ae1f064d
20 Version Oui Version actuelle d'App Engine utilisée en production : 1.9.76

Quotas et limites

Votre application est affectée par les quotas associés aux journaux suivants :

  • Données de journaux récupérées via l'API Logs
  • Quota d'ingestion et de conservation de journaux

Quota de données récupérées

Les 100 premiers mégaoctets de données de journaux récupérées par jour via les appels de l'API Logs sont gratuits. Une fois ce montant dépassé, aucun autre appel de l'API Logs ne réussira, à moins d'avoir activé la facturation pour votre application. Si la facturation est activée, les volumes de données supérieurs à 100 mégaoctets entraînent des frais de 0,12 $/Go.

Attribution d'un quota d'ingestion de journaux

La journalisation des applications App Engine est fournie par Stackdriver. Pour en savoir plus sur les coûts et limites de journalisation, consultez la section relative aux tarifs de Stackdriver. Pour stocker les journaux à long terme, vous pouvez les exporter depuis Stackdriver vers Cloud Storage, BigQuery et Cloud Pub/Sub.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Environnement standard App Engine pour Java 8