Aller au contenu

Requêtes LogQL

LogQL est le langage de requête de Loki, inspiré de PromQL.

Syntaxe de Base

Sélecteur de Stream

{label="value"}

Exemples simples

# Tous les logs d'une application
{app="nestjs-backend"}

# Logs de production
{env="prod"}

# Combinaison
{app="nestjs-backend", env="prod"}

# Regex sur les labels
{app=~"nextjs-.*"}

# Négation
{app!="python-scraper"}

Filtres de Ligne

Contient

{app="nestjs-backend"} |= "error"

Ne contient pas

{app="nestjs-backend"} != "health"

Regex

{app="nestjs-backend"} |~ "(?i)error|exception"

Regex négative

{app="nestjs-backend"} !~ "DEBUG|TRACE"

Parsers

JSON

{app="nestjs-backend"} | json

Extrait les champs JSON comme labels.

Logfmt

{app="api"} | logfmt

Parse le format key=value key2=value2.

Pattern

{app="nginx"} | pattern "<ip> - - [<timestamp>] \"<method> <path> <_>\" <status>"

Regex avec capture

{app="api"} | regexp "(?P<method>GET|POST) (?P<path>/\\S+)"

Filtres sur Labels Extraits

Après parsing, filtrez sur les nouveaux labels :

{app="nestjs-backend"}
| json
| level="error"
{app="api"}
| json
| status >= 500

Fonctions d'Agrégation

Compter les logs

count_over_time({app="nestjs-backend"} [5m])

Taux par seconde

rate({app="nestjs-backend"} [5m])

Somme par label

sum by (app) (count_over_time({env="prod"} [1h]))

Top 10 des erreurs

topk(10, sum by (app) (count_over_time({env="prod"} |~ "error" [1h])))

Exemples Pratiques

Erreurs des dernières 24h par app

sum by (app) (
  count_over_time({env="prod"} |~ "(?i)error" [24h])
)

Logs avec latence > 1000ms

{app="nestjs-backend"}
| json
| duration > 1000

Requêtes HTTP 5xx

{app="nestjs-backend"}
| json
| status_code >= 500 and status_code < 600

Exceptions Python avec stack trace

{app="python-scraper"}
|~ "Traceback|Exception|Error"

Logs entre deux timestamps

{app="nestjs-backend"}
| json
| timestamp >= "2024-01-01T00:00:00Z" and timestamp < "2024-01-02T00:00:00Z"

Grouper par niveau de log

sum by (level) (
  count_over_time({app="nestjs-backend"} | json [1h])
)

Requêtes pour Dashboards

Volume de logs par app (timeseries)

sum by (app) (count_over_time({env="prod"} [$__interval]))

Ratio erreurs/total

sum(count_over_time({env="prod"} |~ "error" [$__interval]))
/
sum(count_over_time({env="prod"} [$__interval]))
* 100

Logs par heure

sum(count_over_time({app="nestjs-backend"} [1h]))

Performance

Tips pour des requêtes rapides

  1. Toujours commencer par les labels - Plus le sélecteur est précis, plus c'est rapide
  2. Filtres de ligne avant parsing - |= "error" avant | json
  3. Limiter la plage temporelle - Évitez les requêtes sur 30 jours
  4. Utiliser line_format avec parcimonie - Coûteux en CPU

Exemple optimisé

# Bon - Labels d'abord, puis filtres
{app="nestjs-backend", env="prod"}
|= "error"
| json
| level="error"

# Mauvais - Trop large, parsing inutile
{env=~".+"}
| json
| app="nestjs-backend"