Logo de Container Logs

Docker et Portainer Nouveau

Connecter Journaux de conteneurs vers Excel, Sheets et l'IA

Docker génère un journal pour chaque conteneur ; interrogez-les tous simultanément. Le fichier JSON contient les journaux écrits par le démon. journaux Docker Les exportations que vous enregistrez manuellement et le journal du serveur de Portainer sont concernés. Indiquez le dossier dans Query Streams et chaque ligne devient une ligne contenant le nom réel du conteneur, son image et son service Compose, au lieu d'un répertoire rempli d'identifiants de 64 caractères.

1connexion
0ports d'entrée
lecture seuleappliqué
3 formats de journalisation de conteneur Docker · Portainer Nommé par conteneur, image et service Lecture seule · rien n'est installé dans le conteneur
La grande idée

Un dossier de journaux de conteneurs devient une table.

Query Streams lit les fichiers déjà écrits par le démon, en conserve le format et vous fournit des colonnes typées, le conteneur étant indiqué à côté de chaque ligne. Aucun processus secondaire, aucun pipeline de distribution, aucun index à maintenir : une ligne que l’analyseur ne peut pas lire est conservée avec une explication au lieu d’être ignorée.

Dossier journalsur l'hôte
a3f9c1…-json.logDocker
Dockershopfront-stack_api.logexporter
portainer.logPortainer

Rotations, archives compressées et fichiers relus — gérés

noisy-containers.sqlSQL
SELECTIONNER application, service_composer,
       compter(*) AS lignes
DE   ensembles de fichiers.événements
  flux = 'stderr'
GROUPE PAR application, service de composition
ORDER BY lignes DESC
Résultatstderr par conteneur
applicationservicelignes
API de vitrineAPI1,284
employé de magasintravailleur417
vitrine-webweb62
cache de la façade de la boutiquecache3

Intégrez-la à la base de données de votre application dans la même requête.

Fichiers que le démon écrit déjà, désormais un tableau sur lequel vous pouvez générer des rapports.

Sources

Deux outils, trois formats, pas de side-car

Chaque fiche indique précisément les fichiers lus par Query Streams et leur emplacement. Vous n'avez pas besoin de modifier votre pilote de journalisation pour que cela fonctionne. fichier json est la valeur par défaut de Docker, et c'est la valeur par défaut qui est prise en charge.

Journaux de conteneurs pris en charge

3 formats · 2 outils
Dockerpilote de journalisation de fichiers JSON
  • Un {"log","stream","time"} une enveloppe par ligne, écrite par le démon
  • Le nom du conteneur provient de Docker lui-même config.v2.json à côté de la bûche
  • Projet/service Image et Compose s'accompagnent comme des colonnes
  • Généralement /var/lib/docker/containers
  • Ajoute ; rotations numérotées et .gz suivi
Dockerexport des journaux Docker
  • Fichiers que vous avez enregistrés avec docker logs --timestamps
  • Un tampon nanoseconde RFC 3339, puis la ligne propre au conteneur
  • Les lignes de bannières de conteneur sont ignorées par déclaration, et non par hasard.
  • N'importe quel dossier dans lequel vous conservez les exportations
  • Un fichier par service ; le nom provient de la racine du fichier
PortainerJournal du serveur, console zerolog
  • portainer.log ou la sortie propre du conteneur
  • Les codes de couleur ANSI sont supprimés avant l'analyse, donc un niveau est un niveau
  • Le clé=valeur La queue se transforme en colonnes ; le reste atterrit dans données
  • Les lignes de forme différente du serveur de tunnel intégré sont également lues
  • Horodatage à la minute près, lu en UTC
Plus à venirCe sont les débuts, pas le plafond

De nouveaux formats de journaux de conteneurs sont ajoutés à chaque nouvelle version de l'Agent. Grâce à la mise à jour automatique des Agents, un format ajouté ultérieurement sera disponible dans votre connecteur sans intervention sur le serveur.

Les trois analyseurs syntaxiques ont été conçus et testés sur de véritables journaux de conteneurs — des fichiers JSON volumineux journaux Docker Exportez les journaux d'un hôte Swarm et du serveur Portainer CE 2.39.1. À noter : sur Docker Desktop pour Windows et Mac, les journaux au format JSON résident dans la machine virtuelle, où un agent exécuté en tant que service ne peut pas y accéder. Exportez-les avec docker logs --timestamps et utilisez le deuxième profil.
Partout où il court

Des conteneurs dans chaque région, les journaux sont lus où ils s'assoient

Les conteneurs sont rarement tous exécutés au même endroit. Un hôte au bureau, un cluster Swarm dans une région cloud, un serveur unique dans un autre pays. Chaque emplacement exécute un agent réseau qui lit les fichiers journaux sur place et se connecte aux flux de requêtes. Pour votre pare-feu, il s'agit d'une connexion sortante ordinaire : aucun port à ouvrir ni VPN à établir.

Siège social Un hôte Docker sur disque local, journaux au format JSON dans le dossier du démon composez le numéro.
UE-Ouest Un cluster Swarm, un journaux Docker exporter par service composez le numéro.
États-Unis-Est Portainer gère une poignée d'hôtes, son propre journal de serveur à côté composez le numéro.

Trois connexions sortantes, un seul point de contrôle : aucun port entrant, aucun VPN, aucune modification du pare-feu.

Un agent par emplacement

Un agent couvre un site entier plutôt qu'un seul dossier : chaque format de journal souhaité devient son propre connecteur de jeu de fichiers sur ce même agent. La configuration standard est d'un agent par emplacement. L'offre gratuite utilise un seul agent, tandis que les offres supérieures en utilisent plusieurs.

1 site = 1 agent = plusieurs connecteurs

Rien à ouvrir

L'agent établit une seule connexion sortante chiffrée, utilisée aussi bien pour la requête sortante que pour les données reçues. Aucun port entrant, VPN ou modification du pare-feu n'est requis ; vos identifiants restent au sein de votre réseau.

une seule connexion, dans les deux sens

Une requête sur plusieurs sites

Chaque source dans un requête fédérée Il désigne son propre agent, de sorte qu'une seule instruction peut lire un journal dans un pays et un journal dans un autre et renvoyer un seul résultat, ou joindre l'un ou l'autre à une base de données. Inclus dans les versions Business et Enterprise.

2 pays → 1 ensemble de résultats

Ils se tiennent au courant

Les agents se mettent à jour automatiquement ; ainsi, un format de journal de conteneur ajouté dans une version ultérieure est déployé sur tous les sites sans qu'aucune connexion serveur ne soit nécessaire pour l'installer. C'est pourquoi la liste ci-dessus représente un point de départ plutôt qu'une liste figée.

De nouveaux formats arrivent avec l'Agent

La partie difficile

Noms, horloges et codes couleur

Un journal de conteneur n'est pas un fichier texte daté. Trois problèmes surviennent fréquemment lorsqu'on tente de le traiter comme des données ; ici, chacun est géré par déclaration plutôt que par conjecture.

Des noms, pas des identifiants hexadécimaux.

Docker nomme chaque dossier de journalisation d'après l'identifiant du conteneur, ce qui rend une requête groupée illisible. Query Streams lit l'enregistrement que Docker écrit à côté du journal et en extrait le nom réel, en conservant l'identifiant dans une colonne distincte.

a3f9c1…-json.log → app = shopfront-api

L'horloge du démon

Un conteneur qui affiche son propre horodatage en secondes Unix (ou temps d'époque) arrive en 1970, si l'on en croit les informations disponibles. L'heure de l'événement correspond à l'heure de capture du démon ; l'horodatage du conteneur est conservé dans une colonne plutôt que d'être considéré comme fiable.

heure de l'enveloppe → heure de l'événement

Codes de couleur dans le fichier

Les enregistreurs de console écrivent directement les séquences d'échappement du terminal dans le journal. Celles-ci sont supprimées avant l'analyse, de sorte qu'un niveau est lu comme un niveau et non comme un niveau entouré de caractères d'échappement ; les octets d'origine restent intacts.

Codes d'échappement supprimés → niveau = INF

Rien ne compte deux fois

Chaque fichier est identifié par ses 4 premiers kilo-octets, ce qui permet de reconnaître un fichier pivoté comme identique plutôt que de le relire depuis le début. Une fenêtre de duplication glissante détecte le chevauchement lorsqu'un processus d'écriture relit sa fin.

Préfixe de hachage de 4 Ko · Fenêtre de 20 000 enregistrements

Le schéma

Les colonnes que vous obtenez réellement

Il ne s'agit pas d'un simple bloc de texte avec un horodatage. Chaque format est analysé et converti en colonnes typées que vous pouvez filtrer, regrouper et agréger directement. De plus, lorsqu'un conteneur enregistre du JSON structuré, ses propres champs sont également décomposés en colonnes.

Logo Docker
journal du conteneur de fichiers JSONDémon Docker
fluxniveaubûcheronmessagehôteservicedonnées
Logo Docker
export des journaux DockerInterface de ligne de commande Docker
message
Logo Portainer
journal de la console zerologPortainer
niveaudemandeurmessageerreurdonnées

Chaque rangée contient également heure_événement, le timbre brut à partir duquel il a été lu, et le fichier dont il provient. Chaque format ajoute sa colonne d'identification — application pour les fichiers JSON et Portainer, récipient pour une exportation — et les lignes du fichier JSON contiennent en outre image, composer_project, composer_service et id_conteneurLe célibataire message La présence d'une colonne sur une exportation est intentionnelle : la ligne propre au conteneur est conservée intégralement plutôt que d'être devinée.

Une seule connexion, chaque surface

Où vos données de journalisation de conteneur peuvent être stockées

Les fichiers journaux ne sont pas une impasse. Connectez le dossier une seule fois et cette même connexion en lecture seule alimentera toutes les interfaces prises en charge par Query Streams : aucune deuxième configuration, aucune deuxième copie des données et aucun traitement différent de celui d’un connecteur de base de données.

Prise en charge

Journal des conteneurs vers Excel

Microsoft Excel · Complément Excel

Importez directement les résultats des journaux de conteneurs en direct dans une feuille de calcul et actualisez-les à la demande — Excel de bureau, Excel Online, Microsoft 365.

Comment fonctionne Excel
Prise en charge

Journalisation des conteneurs vers Google Sheets

Module complémentaire Sheets

Exécutez une requête de journal de conteneur enregistrée depuis la barre latérale et glissez-déposez les lignes dans la feuille. Les collaborateurs peuvent ensuite l'actualiser eux-mêmes.

Comment fonctionne Google Sheets
Prise en charge

Serveur MCP des journaux de conteneur

Clients Claude, Cursor et MCP · Serveur MCP

Donnez à un assistant IA un accès en lecture seule au journal du conteneur avec le schéma dont il a besoin pour écrire du SQL correct — aucune information d'identification dans la conversation.

Comment fonctionne MCP
Prise en charge

API REST des journaux de conteneurs

point de terminaison HTTP

Publiez une requête de journalisation de conteneur sous forme de point de terminaison JSON authentifié, accessible à toute application, avec une spécification OpenAPI 3.1 et des collections Postman, Insomnia et Hoppscotch prêtes à l'emploi. Aucun port de base de données n'est ouvert.

Comment fonctionne une API REST ?
Prise en charge

Journal des conteneurs vers Airtable

Plateforme d'automatisation

Synchronisez les lignes de journal du conteneur avec une base Airtable selon une planification, ou récupérez-les dans un script d'automatisation Airtable.

Comment fonctionne Airtable
Prise en charge

Journaux de conteneur vers Baserow

Plateforme d'automatisation

Alimentez une table Baserow à partir du journal du conteneur via le point de terminaison REST — auto-hébergé ou cloud Baserow.

Comment fonctionne Baserow
Prise en charge

Journal de conteneurs vers SeaTable

Plateforme d'automatisation

Maintenez une base SeaTable à jour avec les données de journalisation des conteneurs sans exporter de fichier ni exposer la base de données.

Comment fonctionne SeaTable
Prise en charge

Journal des conteneurs vers Smartsheet

Plateforme d'automatisation

Intégrez les résultats du journal des conteneurs dans une grille Smartsheet afin que les plans et les rapports soient lus à partir du système source et non de l'exportation de la semaine précédente.

Comment fonctionne Smartsheet
Prise en charge

Journalisation des conteneurs vers Anvil

Anvil Works · Plateforme d'applications

Utilisez une application Python Anvil avec journalisation du conteneur via le point de terminaison REST au lieu d'intégrer les identifiants de base de données dans l'application.

Comment fonctionne Anvil
Prise en charge

Journalisation des conteneurs dans Power BI

Power Query M

Collez le code Power Query M généré dans l'éditeur avancé de Power BI et le rapport lira les résultats du journal du conteneur en direct via HTTPS — aucun pilote ODBC, aucun port de base de données ouvert.

Comment fonctionne Power BI
Prise en charge

Alertes et rapports des journaux de conteneurs

Slack · Discord · Courriel · Webhook

Programmez une requête de journalisation de conteneur et faites en sorte que les lignes soient envoyées à Slack, Discord, par e-mail ou via un webhook signé — ou conservez le message jusqu'à ce qu'un nombre de lignes, un seuil ou un pourcentage de variation dépasse la limite que vous avez définie.

Fonctionnement des alertes et des rapports
La carte des alertes mérite une attention particulière pour les conteneurs : une requête planifiée sur le nombre d’erreurs ne nécessite aucune surveillance du terminal, et une boucle de redémarrage est automatiquement notifiée sur Slack. Les guides pas à pas spécifiques aux journaux ne sont pas encore disponibles ; les pages liées expliquent le fonctionnement de chaque interface.

Ce que cela ne fait pas délibérément

Il ne s'agit pas d'un flux en temps réel. Query Streams lit les fichiers tels qu'ils se trouvent sur le disque lors de l'exécution de la requête ; une boucle de redémarrage apparaît donc sous forme de lignes et non comme un flux continu. Si vous avez besoin d'alertes en moins d'une seconde sur une ligne dès son affichage, un pipeline de journalisation est l'outil approprié.

La sortie d'un conteneur est libre, ce qui a une conséquence importante : tout ce que votre application affiche se retrouve dans le tableau. Si elle enregistre un jeton ou l'adresse e-mail d'un client, cette chaîne de caractères est déjà présente dans le fichier journal et figurera également dans la colonne correspondante. Il n'existe pas de fonction d'exclusion d'en-tête comme pour un journal de serveur web ; traitez donc le tableau résultant avec la même précaution que vous le feriez pour le fichier journal.

Deux limites plus petites, nommées plutôt que cachées. Sur un journaux Docker La ligne d'exportation du conteneur est conservée intacte dans une seule message La colonne ; la réanalyse de cette ligne interne selon son propre format n'est pas encore implémentée. De plus, les attributs optionnels que Docker peut associer à une balise de journalisation ne sont reconnus que par leur forme ; aucun conteneur du corpus capturé ne les a utilisés, donc ce chemin est déclaré, mais non prouvé.

Le reste suit la conception habituelle. L'agent se connecte en sortie et lit les fichiers ; rien n'est installé dans le conteneur, aucune donnée n'est écrite en arrière-plan, le socket Docker et l'API ne sont jamais utilisés, et l'accès est en lecture seule. La durée de rétention est de 30 jours par défaut et vous pouvez la modifier.

Comment ça marche

Trois étapes, et rien n'est installé dans un conteneur.

01

Indiquez le dossier des journaux

Accordez à un agent Query Streams un accès en lecture à l'emplacement où les journaux sont déjà enregistrés. /var/lib/docker/containers sur un hôte Docker, dans un dossier d'exportations enregistrées, ou sur un partage où vous les avez rassemblées.

02

Il reconnaît le format

Query Streams identifie le format à partir du contenu des lignes, et non du nom de fichier ; ainsi, une copie renommée reste lisible, et un fichier qui ne correspond pas au format défini est mis en attente avec une explication au lieu de corrompre la table.

03

Interrogez-le ou joignez-le

Exécutez des requêtes SQL depuis le portail, intégrez-les dans Microsoft Excel ou Google Sheets, ou utilisez une requête fédérée pour joindre les journaux de conteneurs aux utilisateurs et aux commandes de votre base de données d'application, le tout en une seule instruction.

FAQ sur les journaux de conteneurs

Dois-je changer mon pilote de journalisation Docker ?

Non. fichier json Il s'agit du pilote par défaut de Docker, et c'est celui qui est pris en charge. Si vous n'avez jamais configuré la journalisation, les fichiers sont déjà présents et correctement structurés.

Si vous avez changé de conducteur, le docker logs --timestamps L'exportation est la voie d'entrée : elle fonctionne quel que soit le pilote, car l'interface de ligne de commande lit à travers le démon.

Comment connaît-il le nom du conteneur et pas seulement son identifiant ?

Docker enregistre le nom du conteneur dans le même dossier que le journal. Query Streams lit ce nom et l'utilise comme colonne d'identité, tandis que l'image, le projet Compose et le service sont conservés dans des colonnes adjacentes. L'identifiant du dossier (64 caractères) est conservé. id_conteneur, donc rien n'est perdu.

Si cet enregistrement est manquant, illisible ou ne comporte pas de nom, le nom du dossier est utilisé à la place et le balayage comptabilise la fréquence à laquelle cela s'est produit ; ainsi, une solution de repli apparaît sous la forme d'un nombre que vous pouvez consulter, et non comme une substitution silencieuse.

J'utilise Docker Desktop pour Windows ou Mac. Est-ce que cela fonctionne ?

Je ne m'attaque pas directement aux journaux au format JSON. Docker Desktop les conserve dans sa propre machine virtuelle, et un agent exécuté en tant que service sur l'hôte ne peut pas y accéder.

La solution consiste à utiliser le profil d'exportation : docker logs --timestamps <conteneur> Les données sont redirigées vers un fichier, dans n'importe quel dossier accessible par l'agent. Il s'agit d'un format pris en charge à part entière, et non d'une solution de contournement : c'est la méthode déjà utilisée pour conserver une copie des journaux après la suppression d'un conteneur.

Est-ce en temps réel ?

Il s'agit d'une lecture à la demande plutôt que d'un traitement en continu. Les fichiers sont lus au fur et à mesure de l'exécution de la requête ; les nouvelles lignes apparaissent donc au fur et à mesure que vos conteneurs les écrivent et que le fichier est pris en compte — non pas selon une planification nocturne fixe, mais sans suivi en temps réel non plus.

Pour poser une question portant sur les dernières semaines et couvrant chaque conteneur, et obtenir la réponse dans un tableur, cette forme est utile et nécessite considérablement moins de machines qu'une pile de bûches.

Et Kubernetes ou Podman ?

Aucun des deux ne possède aujourd'hui de profil propre, et nous préférons le dire plutôt que de sous-entendre une couverture. Ce qui s'applique, c'est le format d'exportation : le profil est lié à la forme exacte. docker logs --timestamps L'écriture se fait comme suit : un tampon nanoseconde RFC 3339, un espace, puis la ligne propre au conteneur, un fichier par service. Les outils qui écrivent selon la même structure lisent également selon cette structure.

La méthode la plus fiable pour vérifier vos propres fichiers est d'effectuer un test de connexion, qui vous indique ce qu'il a reconnu avant toute action de votre part.

Mes conteneurs enregistrent du JSON. Est-ce que je récupère leurs champs sous forme de colonnes ?

Oui, pour les journaux au format JSON. L'enveloppe du démon est déballée et le JSON propre au conteneur est aplati en colonnes : niveau, journaliseur, message, hôte et service, le cas échéant. Tout ce qui ne correspond à aucune colonne nommée est conservé dans un espace vide. données La colonne n'est pas supprimée, ce qui permet d'interroger un champ inhabituel.

Le seul élément qui n'est pas extrait du JSON du conteneur est l'horodatage. Celui-ci provient du démon, car l'horodatage propre à une application peut être dans n'importe quel format et une erreur de formatage entraîne un décalage temporel silencieux de la ligne.

Que se passe-t-il si l'analyseur syntaxique ne peut pas lire une ligne ?

Elle est conservée, non supprimée. Une ligne ne respectant pas le format défini est conservée comme une ligne brute avec une explication, de sorte qu'une entrée malformée ou un changement de format inattendu apparaisse comme une information visible et exploitable, et non comme une lacune silencieuse dans vos données.

Vos conteneurs communiquent déjà.

Connectez un dossier de logs et exécutez votre première requête en quelques minutes. Offre gratuite, sans carte de crédit, sans installation dans le conteneur.

Lecture seule · Connexion sortante uniquement · Vos journaux restent sur votre hôte