gcloud et Cloud Logging — antisèche
Les commandes et requêtes du cours, sur une page.
gcloud : se connecter et choisir son projet
| Besoin | Commande |
|---|---|
| Première configuration | gcloud init |
| Identité de la CLI | gcloud auth login |
| Identité des bibliothèques clientes (ADC) | gcloud auth application-default login |
| Voir compte et projet actifs | gcloud config list |
| Changer de projet | gcloud config set project ID_DU_PROJET |
| Une config par environnement | gcloud config configurations create dev puis … activate dev |
| Viser un projet pour une seule commande | --project=ID_DU_PROJET |
| Activer l’API Logging | gcloud services enable logging.googleapis.com |
| Sortie pour script / humain / brute | --format=json · --format="table(…)" · --format="value(…)" |
| Aide d’une commande | gcloud logging read --help |
Piège classique : gcloud auth login ne suffit pas pour ton code Python en local.
Les bibliothèques lisent les ADC, créées par gcloud auth application-default login.
Cloud Logging : les concepts
| Élément | À retenir |
|---|---|
| Entrée de log | timestamp · severity · resource · logName · textPayload / jsonPayload · httpRequest · trace |
| Sévérités | DEFAULT < DEBUG < INFO < NOTICE < WARNING < ERROR < CRITICAL < ALERT < EMERGENCY |
| Log Router | Chaque entrée passe par les sinks (filtre d’inclusion + exclusions → destination) |
| Destinations | bucket de logs · BigQuery · Cloud Storage · Pub/Sub · autre projet |
_Required | audit Admin Activity, System Event… · 400 jours · non modifiable |
_Default | tout le reste · 30 jours par défaut · réglable |
| Réduire la facture | exclusions sur les logs bruyants, pas de DEBUG en prod |
| Rôle IAM | Permet |
|---|---|
roles/logging.viewer | lire les logs (hors Data Access) |
roles/logging.privateLogViewer | lire aussi les logs Data Access |
roles/logging.configWriter | gérer sinks, buckets, métriques |
roles/logging.admin | tout |
roles/logging.logWriter | écrire des logs (compte de service d’une app) |
gcloud logging buckets list
gcloud logging buckets update _Default --location=global --retention-days=365
gcloud logging sinks create NOM DESTINATION --log-filter='severity>=ERROR'
gcloud logging logs list
Langage de requête
| Besoin | Requête |
|---|---|
| Égal / différent | severity="ERROR" · severity!="INFO" |
| Au moins un niveau | severity>=WARNING |
| Un service Cloud Run | resource.type="cloud_run_revision" puis resource.labels.service_name="api" |
| Erreurs serveur | httpRequest.status>=500 |
| Un champ JSON | jsonPayload.userId="u-42" |
| Contient (sous-chaîne) | jsonPayload.message:"timeout" |
| Expression régulière | jsonPayload.message =~ "(?i)timeout" |
| Un mot, partout | SEARCH("timeout") |
| Une plage de temps | timestamp>="2026-11-05T09:00:00Z" AND timestamp<"2026-11-05T10:00:00Z" |
| Toute une requête | trace="projects/PROJET/traces/ID" |
Une condition par ligne = AND implicite. AND, OR, NOT s’écrivent en
majuscules. Les heures sont en UTC.
Lire depuis le terminal
gcloud logging read 'severity>=ERROR' --freshness=1h --limit=20 --project=ID
gcloud logging read 'severity>=ERROR' --freshness=1h --limit=10 \
--format='value(timestamp,severity,jsonPayload.message)'
gcloud logging read 'severity>=ERROR' --limit=500 --format=json | jq '.[].jsonPayload'
gcloud beta logging tail 'severity>=WARNING'
Écrire des logs structurés (Python)
- Sur Cloud Run, Functions, GKE : un objet JSON par ligne sur stdout. Les champs
severity,message,httpRequest,logging.googleapis.com/traceetlogging.googleapis.com/labelssont reconnus. - Avec la bibliothèque :
google.cloud.logging.Client().setup_logging(), puislogger.info("…", extra={"json_fields": {"userId": "u-42"}}). - Toujours : noms de champs stables, un événement par ligne, jamais de secret ni de donnée personnelle.
Tableaux de bord et alertes
gcloud logging metrics create erreurs_5xx \
--description="Réponses 5xx" --log-filter='httpRequest.status>=500'
gcloud logging metrics list
gcloud monitoring dashboards create --config-from-file=dashboard.json --validate-only
gcloud monitoring dashboards create --config-from-file=dashboard.json
- Une métrique basée sur les logs compte à partir de sa création, jamais le passé.
- Type de métrique dans un graphique :
logging.googleapis.com/user/NOM. - Peu de labels, à faible cardinalité (jamais un
userId). - Le JSON du tableau de bord se versionne dans git.
Outils du quotidien
| Besoin | Outil |
|---|---|
Aide sur --filter / --format | gcloud topic filters · gcloud topic formats |
| Déboguer une commande gcloud | --verbosity=debug · --log-http (ne pas coller la sortie dans un ticket) |
| Région par défaut Cloud Run | gcloud config set run/region europe-west1 |
| Lire les logs en Python | Client(project=…).list_entries(filter_=…, order_by=DESCENDING, max_results=…) |
| Shell prêt à l’emploi | Cloud Shell (gcloud préinstallé) |
| Logs dans l’éditeur | Cloud Code (VS Code) |
Helpers : en lecture seule, --project explicite, toujours un --limit, jamais
d’identifiants dans le dépôt.
Voir aussi la carte du cours.