Explorer les logs cloud pour aider l'équipe
Le gain du jour : retrouver dans les logs cloud la trace exacte d’un bug que tu viens de reproduire, et joindre à ton rapport la preuve qui fait gagner une heure au développeur.
Un log cloud, c’est quoi ?
Un log est une ligne horodatée qu’un programme écrit pour dire ce qu’il fait : « requête reçue », « paiement refusé », « exception levée ». Ton app mobile parle à des serveurs (l’API, l’authentification, le paiement). Chacun de ces serveurs écrit ses logs. Dans le cloud, ces lignes ne restent pas sur une machine. Elles sont envoyées vers un service de logs centralisé où l’on peut les chercher toutes au même endroit.
Les plus courants : Google Cloud Logging (son écran de recherche s’appelle le Logs Explorer), AWS CloudWatch Logs, Azure Monitor, Datadog. Les noms changent, la démarche est la même. Les exemples de cette leçon utilisent le Logs Explorer de Google Cloud.
- Logs de l’appareil :
logcatsur Android, la Console sur macOS pour iOS. Ils disent ce que l’app a fait sur le téléphone. - Crash reporting : Firebase Crashlytics, Sentry. Ils regroupent les plantages de l’app chez tous les utilisateurs.
- Logs cloud : ce que les serveurs ont reçu et répondu. C’est le sujet ici.
Pourquoi un testeur QA s’en sert
Tu vois l’écran. Le développeur voit le code. Les logs cloud montrent ce qui s’est passé entre les deux. On construit le chemin en trois étapes.
D’abord, ton action sur l’app part vers le serveur :
📱 App (toi, testeur) ──── requête HTTP ────▶ ☁️ API
Ensuite, le serveur écrit ce qu’il a reçu et ce qu’il a répondu dans le service de logs :
📱 App ──── requête ────▶ ☁️ API
│
▼ écrit
🗂 Service de logs
(timestamp, severity, message, requestId)
Enfin, toi tu vas lire ces logs et tu joins l’extrait au bug :
📱 App ──── requête ────▶ ☁️ API
│ │
│ note l'heure + ▼ écrit
│ le compte de test 🗂 Service de logs
│ │
└──────▶ 🔎 Logs Explorer ◀─┘
│
▼
🐞 Bug JIRA + extrait de log + lien vers la requête
Concrètement, les logs te permettent de répondre à une question que le développeur va poser de toute façon : le problème vient-il de l’app ou du serveur ?
| Ce que tu vois dans les logs | Ce que ça veut dire | À qui l’envoyer |
|---|---|---|
| Aucune requête à l’heure du test | La requête n’est jamais partie (ou pas vers ce serveur) | Équipe mobile |
Requête reçue, réponse 4xx (400, 401, 404, 422) | Le serveur a refusé ce que l’app a envoyé | Souvent mobile, à vérifier avec le back |
Requête reçue, réponse 5xx (500, 502, 503) | Le serveur a planté ou un service derrière lui | Équipe back-end |
Réponse 200 mais une ligne ERROR juste après | Erreur silencieuse : l’écran dit OK, le serveur non | Équipe back-end, bug souvent sévère |
Réponse 200 correcte, mais l’app affiche faux | Le serveur a bien répondu, l’app interprète mal | Équipe mobile |
L’anatomie d’une entrée de log
Dans le Logs Explorer, chaque ligne se déplie en un objet structuré. Les champs qui comptent pour toi :
{
"timestamp": "2026-11-05T09:42:17.318Z",
"severity": "ERROR",
"resource": { "type": "cloud_run_revision", "labels": { "service_name": "api-panier" } },
"httpRequest": { "requestMethod": "POST", "requestUrl": "/v1/panier/items", "status": 500 },
"jsonPayload": {
"message": "quantity must be >= 0",
"userId": "qa-test-042",
"appVersion": "3.2.1"
},
"trace": "projects/mon-projet/traces/4bf92f3577b34da6a3ce929d0e0e4736"
}
timestamp: toujours en UTC (leZfinal). À Paris en hiver, 10 h 42 chez toi s’écrit 09:42 ici.severity: le niveau, du moins grave au plus grave :DEBUG,INFO,NOTICE,WARNING,ERROR,CRITICAL,ALERT,EMERGENCY.resource: quel service a écrit la ligne.httpRequest.status: le code HTTP renvoyé (voir le cours API REST).jsonPayload: le message et les données ajoutées par les développeurs.trace: un identifiant commun à toutes les lignes d’une même requête, même si elle traverse plusieurs services.
Chercher : du large au précis
Le Logs Explorer a deux réglages : une fenêtre de temps (en haut) et une requête dans le langage de requête de Cloud Logging. La bonne méthode est de partir large puis de resserrer.
1. Les erreurs autour de ton test. Règle la fenêtre sur 15 minutes autour de l’heure notée, puis :
severity>=ERROR
2. Seulement le service concerné.
resource.labels.service_name="api-panier"
severity>=WARNING
Deux lignes sur deux lignes séparées sont reliées par un AND implicite.
3. Seulement ton compte de test.
resource.labels.service_name="api-panier"
jsonPayload.userId="qa-test-042"
4. Un mot que tu as vu à l’écran, sans savoir dans quel champ il se trouve :
SEARCH("quantity")
SEARCH ignore la casse et cherche des mots entiers. Pour un bout de texte dans un
champ précis, utilise une expression régulière avec =~ :
jsonPayload.message =~ "(?i)quantit"
5. Toute l’histoire d’une requête. Clique sur une ligne intéressante, copie sa
valeur trace, puis :
trace="projects/mon-projet/traces/4bf92f3577b34da6a3ce929d0e0e4736"
Tu vois alors toutes les lignes de cette requête, dans l’ordre, dans tous les services qu’elle a traversés.
Astuces de terrain
- Note l’heure exacte au moment du bug, à la seconde si possible, et pense au décalage UTC. Une capture d’écran de la barre d’état ou une vidéo horodatée suffit.
- Teste avec un compte identifiable (
qa-test-042). Chercher son propreuserIdest bien plus rapide que de fouiller les logs de tous les utilisateurs. - Garde la fenêtre de temps courte. Une requête sur 7 jours est lente, chère, et noyée sous le bruit.
- Sauvegarde tes requêtes utiles (« Saved queries ») et partage-les avec l’équipe QA.
- Partage le lien, pas une capture. Le bouton « Partager le lien » du Logs Explorer garde la requête et la fenêtre de temps. Le développeur ouvre exactement ce que tu as vu.
- Regarde l’histogramme en haut des résultats. Un pic d’erreurs à une heure précise est souvent lié à un déploiement.
- Ne colle jamais de données personnelles dans JIRA. Emails, numéros de
téléphone, tokens : copie le
traceou l’identifiant de requête, pas la ligne entière si elle en contient. - Demande un accès en lecture seule. Sur Google Cloud, le rôle
roles/logging.viewersuffit pour explorer. Tu n’as besoin de rien modifier.
Ce que le QA peut faire pour aider l’équipe
Au-delà de lire les logs, tu es bien placé pour les améliorer, parce que tu es souvent le premier à essayer de s’en servir sur un vrai problème.
- Enrichir chaque bug report avec le
trace, le code HTTP et le lien vers la requête. Ajoute une ligne « Logs » dans ton modèle de rapport (leçon 9). - Trier front ou back avant d’assigner, avec le tableau plus haut. Le bug arrive directement à la bonne équipe.
- Signaler les erreurs silencieuses : un
ERRORcôté serveur alors que l’app affiche « Succès ». C’est un vrai bug, même si l’écran semble correct. - Rapporter les logs inutilisables comme des défauts. Une erreur sans
userId, sans version d’app ou avec un message vague (« Something went wrong ») ralentit tout le monde. Une donnée sensible écrite en clair (mot de passe, numéro de carte) est un bug de sécurité à remonter tout de suite. - Proposer un identifiant visible dans l’app. Demande aux développeurs d’afficher
le
requestIdou letracedans un écran de debug des builds de test. Tu le recopies dans le bug et la recherche prend dix secondes. - Transformer une recherche répétée en alerte. Si tu lances la même requête après chaque recette, propose d’en faire une alerte basée sur les logs. L’équipe est prévenue sans que personne n’ait à y penser.
Vérifie ta compréhension
Tu valides un paiement dans l'app. L'écran affiche « Paiement réussi ». Dans les logs, la requête a un statut 200, puis une ligne ERROR « échec d'envoi du reçu » apparaît avec le même trace. Que fais-tu ?
Tu as reproduit un bug à 10 h 42 heure de Paris (hiver, UTC+1). Quelle fenêtre de temps règles-tu dans le Logs Explorer si l'outil affiche l'UTC ?
À toi de jouer
Demande un accès en lecture seule aux logs de l’environnement de test (sur Google Cloud :
roles/logging.viewer).Reproduis un parcours avec ton compte de test, note l’heure, puis retrouve tes requêtes avec
jsonPayload.userId=”…”(adapte le nom du champ à ton projet).Ouvre une ligne, copie son
traceet affiche toute l’histoire de la requête.Ajoute une ligne « Logs (trace + lien) » à ton modèle de bug report.
🗂 Fiche de référence associée : Glossaire QA mobile — antisèche.