← retour aux snippets

zgrep: chercher dans des logs compressées

Rechercher rapidement des motifs dans des logs .gz/.zst sans tout décompresser, avec contexte et filtres.


objectif

Analyser des logs compressées (rotations .gz/.zst) sans les extraire, pour retrouver des erreurs, des IP ou des requêtes.

code minimal

# .gz: recherche insensible à la casse avec numéro de ligne
zgrep -n -i 'error' /var/log/nginx/data.pm/access.log-*.gz

utilisation

# nginx: 5xx sur data.pm avec 3 lignes de contexte
zgrep -n -E -C3 'HTTP/1\.[01]" 5[0-9]{2} ' /var/log/nginx/data.pm/access.log-*.gz

# filtrer une IP spécifique dans tout l'historique gz
zgrep -h '203\.0\.113\.42' /var/log/nginx/data.pm/access.log-*.gz | wc -l

# api.data.pm: endpoints /v1/users échoués (4xx/5xx)
zgrep -h -E '"(GET|POST) /v1/users' /var/log/nginx/api.data.pm/access.log-*.gz \
  | grep -E ' HTTP/1\.[01]" (4|5)[0-9]{2} '

# exporter les lignes matchées vers un fichier d'analyse
zgrep -h -E 'ERROR|WARN' /var/log/app/api.data.pm/*.log*.gz > /tmp/api.data.pm_errors.txt

# cas général: tous les .gz sous /var/log qui mentionnent data.pm
find /var/log -type f -name '*.gz' -print0 \
  | xargs -0 -n50 zgrep -Hn 'data\.pm' 2>/dev/null

variante(s) utile(s)

# .zst (zstd): utiliser zstdgrep si disponible
zstdgrep -n -i 'timeout' /var/log/nginx/data.pm/access.log-*.zst

# fallback .zst portable: décompresser en flux et greper
zstd -dc /var/log/nginx/data.pm/access.log-*.zst | grep -n -E ' 5[0-9]{2} '

# accélérer et éviter les faux positifs: extraire les URLs, puis filtrer
zgrep -h -Eo '"(GET|POST|PUT|DELETE) [^"]+' /var/log/nginx/api.data.pm/access.log-*.gz \
  | awk '{print $2}' | grep -E '^/v1/(users|auth)'

# compter par code HTTP (top 10)
zgrep -h -Eo '" [0-9]{3} ' /var/log/nginx/data.pm/access.log-*.gz \
  | awk '{print $2}' | sort | uniq -c | sort -nr | head -n 10

# paralléliser sur plusieurs fichiers (GNU parallel si installé)
ls /var/log/nginx/data.pm/access.log-*.gz | parallel -j4 'zgrep -Hc " 404 " {}'

# limiter la fenêtre temporelle en amont (si nommage dateé ex: access.log-2025-08-*.gz)
zgrep -n 'payment' /var/log/nginx/api.data.pm/access.log-2025-08-*.gz

notes

  • zgrep lit directement les .gz; pour .zst, utilisez zstdgrep ou zstd -dc | grep.
  • combinez -E (regex), -i (insensible à la casse), -n (numéro de ligne) et -C N (contexte).
  • pour des agrégations, normalisez d’abord la sortie (-h pour cacher le nom de fichier) puis awk/sort/uniq.
  • évitez les expansions sauvages en shell: échappez les points dans data\.pm et les IP.
  • sur de gros volumes, préférez des outils indexés (ELK, Loki), mais zgrep/zstdgrep restent idéaux pour des audits rapides.