Table des matières

Comment query les logs dans Loki ?

Dans Grafana, on va dans la boussole, “Explore”, puis tout en haut on sélectionne la datasourceLoki”. 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, …).

Installation de LogCLI

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"}'