Comment query les logs dans Loki ?
Dans Grafana, on va dans la boussole, “Explore”, puis tout en haut on sélectionne la datasource “Loki”. On peut sélectionner les labels qui nous intéressent (exemple : container=blog
, pour voir les logs du conteneur blog
).
Voici un lien pour voir les logs du blog de Picasoft sur la dernière heure.
Grafana/Loki permet de faire des requêtes bien plus complexes, en faisant de l’agrégation, un peu comme des opérateurs SQL (style max()
). Docs officielles
Exemples de requêtes
Récupérer les erreurs du service Mattermost
{container="mattermost-app"} |= `error`
Récupérer les requêtes ayant entraîné une réponse 401 sur Mattermost sur pica02
{container="traefik", host="pica02"} | json status="OriginStatus", dockerService="ServiceName" | status = `401` | dockerService = `mattermost-app@docker`
Utilisation de LogCLI
LogCLI est un petit utilitaire fourni par l’équipe de développement de Loki afin d’interagir avec une infrastructure de logs sous Loki. Il permet d’exécuter des requêtes LogQL et automatise le processus de récupération (gestion de la récupération de l’ensemble des pages sur un intervalle de temps, parallélisation du téléchargement, filtre, …).
Connexion au serveur de Loki
- snippet.bash
export LOKI_ADDR=https://loki.picasoft.net export LOKI_USERNAME=<identifiants dans le pass> export LOKI_PASSWORD=<identifiants dans le pass>
On peut tester la connexion avec :
- snippet.bash
logcli labels job
Récupérer l'ensemble des labels disponibles
Lors de la construction des requêtes LogQL, on utilise des labels afin de filtrer les logs disponibles.
On peut voir les labels présents avec :
- snippet.bash
logcli labels
On peut voir l’ensemble des valeurs disponibles pour un label donné avec :
- snippet.bash
logcli labels <label>
Récupérer les logs sur un intervalle donné
Avec traefik par exemple :
- snippet.bash
logcli query --limit 0 --from 2023-11-04T00:00:00Z --to 2023-11-05T00:00:00Z '{container='traefik'}'
On peut spécialiser la requête pour télécharger les logs d’une machine spécifiquement :
- snippet.bash
logcli query --limit 0 --from 2023-11-04T00:00:00Z --to 2023-11-05T00:00:00Z '{container="traefik",host="media"}'
On peut demander de télécharger les lignes seules raw
ou dans un format json jsonl
avec le flag -o <raw|jsonl>
, au lieu du format par défaut.
On peut gérer les options de parallélisation avec les flags --parallel-duration=<duration>
et --parallel-max-workers=n
pour gérer respectivement la taille des intervalles demandés et le nombre de worker téléchargeant les différents intervalles. Par exemple --parallel-duration=1h --parallel-max-workers=4
.
On peut paramétrer la gestion des erreurs lors du téléchargement avec les flags --retries=n
(nombre d’essais en cas d’erreur avant d’échouer) --min-backoff=s
(nombre minimum de secondes à attendre avant de ressayer en cas d’erreur) et --max-backoff=s
(nombre maximum de secondes à attendre avant de ressayer en cas d’erreur). En cas d’erreur l’outil va attendre un nombre aléatoire de secondes et ressayer le téléchargement, exemple --retries 10 --min-backoff=25 --max-backoff=180
.
Visualisation des logs en direct
Au lieu de télécharger les logs sur un intervalle donné, on peut les visionner en direct avec :
- snippet.bash
logcli query --follow '{unit="ssh.service"}'