Server logs & traffic analysis

GoAccess

Analyseur de journaux web en temps réel qui tourne dans votre terminal ou produit un tableau de bord HTML autonome en un seul fichier

allinurl/goaccessC20,890 as of 2026-09-02
By Jake Luo · Published 2 sept. 2026

GoAccess est un analyseur de journaux libre sous licence MIT, écrit en C, qui lit le journal d'accès de votre serveur web et montre ce que votre serveur a réellement servi : sous forme de tableau de bord interactif dans le terminal, ou de fichier HTML unique et autonome que vous pourriez envoyer par courriel. Il interprète nativement les journaux Apache, Nginx, Caddy, CloudFront, S3, Elastic Load Balancing, Traefik et IIS, plus tout format personnalisé que vous décrivez, et ne demande que ncurses pour fonctionner. Il comptait 20 890 étoiles GitHub au 2 septembre 2026. Pour qui construit, il répond très bien à une question étroite : ce qui a été demandé, ce que votre serveur a répondu et combien de temps cela a pris — y compris les requêtes qui n'ont jamais exécuté votre JavaScript.

Ce qu'est réellement GoAccess

GoAccess github.com/allinurl/goaccess est maintenu depuis 2013 et écrit en C, ce qui se voit dans ce que l'on remarque en premier : une seule dépendance obligatoire, ncurses, et un démarrage instantané. Pointez-le vers un journal — `goaccess access.log` — et vous obtenez un tableau de bord interactif dans le terminal. Ajoutez `-o report.html --real-time-html` et il écrit un fichier HTML unique sans aucune dépendance externe, puis y pousse des mises à jour en direct via un serveur WebSocket qu'il embarque lui-même, sur le port 7890 par défaut.

  • Il lit le format de journal que vous avez déjà Apache common et combined, Nginx, le format JSON structuré de Caddy, Traefik, Squid, W3C d'IIS, Amazon CloudFront, S3, Elastic Load Balancing et Google Cloud Storage sont prédéfinis. Tout le reste se décrit avec une chaîne de format personnalisée.
  • Il tourne là où est le journal, ou là où vous êtes Il analyse des fichiers, des ensembles de fichiers alternés et compressés passés par `zcat --force`, ou l'entrée standard. Vous pouvez donc ne rien installer sur le serveur et lancer depuis votre portable `ssh -n you@server 'tail -f /var/log/nginx/access.log' | goaccess -`.
  • Il garde un historique sans base de données `--persist` écrit son jeu de données sur le disque et `--restore` le recharge en y ajoutant les nouvelles lignes. Il retient l'inode de chaque fichier et l'horodatage de la dernière ligne analysée, si bien qu'une nouvelle exécution ne compte pas deux fois, et `--keep-last=5` recycle ce qui dépasse cinq jours.
  • Il regroupe le trafic comme le pense une personne qui exploite Des panneaux pour les requêtes, les 404, les fichiers statiques, la bande passante, le temps de réponse, les référents et les hôtes virtuels, plus — avec la base MaxMind optionnelle — la géographie et l'ASN, c'est-à-dire le panneau qui rend évident un unique réseau bruyant.
  • Il est toujours activement développé La dernière étiquette est la v1.11 du 15 juillet 2026, et les commits des derniers jours d'août 2026 relèvent du travail produit ordinaire : une catégorie dédiée aux robots d'IA, le trafic du Fédiverse séparé des robots, l'exclusion de trafic par ASN, un suivi des campagnes UTM en remplacement de l'ancien panneau de phrases clés, et une mesure en direct des requêtes par seconde.

La licence est un MIT simple, inscrit dans le fichier COPYING du dépôt plutôt que laissé à un badge. Il y a 449 tickets ouverts, ce qui, pour un projet en C de treize ans qui interprète tous les formats de journaux jamais inventés, ressemble davantage à une preuve d'usage qu'à de l'abandon : une grande part porte sur des questions de format de journal, de date et d'heure, et le fichier README renvoie directement aux plusieurs centaines déjà closes.

Ce que coûte son exploitation

Le vrai coût n'est pas le processeur, c'est l'accès. Il faut pouvoir lire le journal d'accès, ce qui l'exclut sur la plupart des plateformes gérées où vous n'en voyez jamais. Il faut connaître son format de journal, et c'est là que le temps part vraiment : un décalage entre le format de date de votre journal et la locale sous laquelle tourne GoAccess est de loin la raison la plus fréquente pour laquelle une première exécution n'affiche rien. Et il faut trancher la question de la persistance dès le départ, car sans `--persist` votre rapport n'est pas plus ancien que le fichier que vous lui avez donné, et la rotation des journaux efface votre historique selon un calendrier choisi par quelqu'un d'autre.

En échange, vous obtenez un outil sans compte, sans balise, sans échantillonnage et sans facture mensuelle, qui répond quelques secondes après la requête. Ce n'est absolument pas de l'analytique produit : il n'a aucune idée de qui est un utilisateur, de ce qu'il a cliqué, ni s'il est revenu la semaine suivante. C'est la couche en dessous, et les deux répondent à des questions assez différentes pour que la plupart des équipes qui en exploitent une finissent par exploiter les deux.

Là où un journal cesse de dire la vérité

Un analyseur de journaux est exactement aussi véridique que le journal, et le moyen le plus rapide de faire cesser à votre journal de décrire votre trafic est de placer un CDN devant. Nous l'avons fait sur agentceres.com en août 2026 et l'effet sur l'origine n'a rien eu de subtil : le cache de pages que retenait notre processus d'origine est passé de 1,33 Go à 0,31 Go, parce que la plupart des requêtes ont tout simplement cessé d'arriver. Chacun de ces accès servis en périphérie est une visite réelle que le journal d'origine ne contiendra jamais.

Quatre choses qui changent en silence le contenu de votre journal
  • Un CDN devant. Les réponses en cache partent depuis la périphérie, votre journal d'origine ne garde donc que les échecs de cache. Lisez les journaux du CDN lui-même pour avoir le tableau complet, ou sachez que vous mesurez des échecs de cache et dites-le.
  • La rotation des journaux. Le réglage par défaut de la plupart des systèmes conserve une à deux semaines. Tout ce que vous n'avez pas persisté disparaît, et disparaît sans la moindre erreur.
  • Un mandataire ou un répartiteur de charge. Sans l'en-tête forwarded-for configuré, chaque requête semble venir d'une seule adresse interne et vos panneaux de géographie et d'ASN deviennent décoratifs.
  • Les fichiers statiques et les vérifications de santé. Un accès n'est pas une page vue. Filtrez jusqu'aux requêtes que vous visez vraiment avant d'annoncer un chiffre à quelqu'un.

Nous avons aussi appris la valeur de lire la source brute dans l'autre sens. Trois heures de notre propre journal d'origine contenaient 1 438 requêtes réparties sur 558 URL distinctes — 2,58 accès par URL — et environ trois quarts relevaient d'un trafic de centres de données aux user agents falsifiés ou vides. Rien de ce rapport n'apparaissait dans notre analytique JavaScript, puisque presque rien de ce trafic n'exécute de JavaScript, et cela a tranché une discussion que nous avions depuis des semaines : pourquoi une durée de cache de deux heures rapportait si peu sur un site de contenu de longue traîne. La version complète de cet argument se trouve dans notre page sur la part de bots dans votre trafic web.

Où il se place quand vous cherchez à croître

L'usage pour la croissance est plus étroit que la portée complète de l'outil et mérite d'être nommé précisément. D'abord la réalité de l'exploration : quelles pages Googlebot et les robots d'IA ont effectivement récupérées, à quelle fréquence et avec quel statut — un 404 dans votre journal est le plus souvent un lien que quelqu'un a publié vers une page que vous avez déplacée. Ensuite le panneau des référents, qui attrape les liens entrants avant qu'aucun outil de netlinking ne les remarque. Enfin le temps de réponse par requête, car une page lente pour les seuls visiteurs réels reste invisible à un test synthétique. Que le projet ait ajouté fin août 2026 une catégorie dédiée aux robots d'IA et séparé le trafic du Fédiverse est un signal correct que le premier usage est désormais une question que beaucoup se posent.

Rien de tout cela n'est le travail de croissance lui-même, et c'est la limite honnête de tout outil de mesure : un journal vous dit ce qui s'est passé et jamais quoi en faire. Publier la page que le robot est venu chercher, écrire la prise de contact qui mérite ce référent, réparer le 404 qui vous coûtait discrètement un lien — tout cela demande encore que quelqu'un s'en occupe. C'est à cela que sert AgentCeres, l'AI Growth Officer sur agentceres.com : une équipe de rôles spécialisés qui rédige le travail, une personne qui valide tout ce qui sort. Si vous êtes plus tôt que cela et que la question est simplement pourquoi personne n'arrive, commencez par pourquoi votre site ne reçoit pas de trafic.

FAQ

GoAccess remplace-t-il Google Analytics ou Plausible ?
Non, et le traiter comme un remplaçant est le chemin le plus court vers la déception. Un outil à balise suit une personne au fil d'une session et sait dire ce qu'elle a cliqué et si elle est revenue. GoAccess lit ce que l'on a demandé à votre serveur et ce qu'il a répondu, sans aucune notion d'utilisateur. Le recouvrement se limite à peu près au nombre de pages vues, et même celui-là divergera : un journal compte des requêtes qui n'ont jamais exécuté de JavaScript, et une balise compte des sessions que votre origine n'a peut-être jamais vues.
Puis-je l'utiliser si mon application tourne sur une plateforme sans accès aux journaux ?
Le plus souvent pas directement, et c'est la première chose à vérifier avant d'y consacrer du temps. Si vous ne pouvez pas lire un journal d'accès, l'équivalent est l'export de journaux de votre CDN, s'il en propose un, ou le journal de requêtes de la plateforme elle-même. Certains services savent déverser les journaux dans un fichier que vous pouvez rediriger, et cela fonctionne très bien : GoAccess lit l'entrée standard sans difficulté et se moque de la provenance des lignes, du moment que vous lui indiquez le format.
Le faire tourner ralentira-t-il un serveur chargé ?
Il lit le fichier de journal au lieu de se placer sur le chemin de la requête, il ne peut donc pas ralentir une réponse comme le ferait un agent intégré au processus. Sur un gros historique, le seul coût réel est l'analyse elle-même, et les suggestions du fichier README y répondent : lancez-le en priorité basse avec `nice`, utilisez `--jobs` pour une analyse multifil et augmentez `--chunk-size` au-delà de sa valeur par défaut. L'autre option consiste à ne pas le lancer sur le serveur et à rediriger le journal vers votre machine par SSH.
Comment conserver plus d'une semaine d'historique ?
En le persistant. Lancez-le une fois avec `--persist` pour écrire le jeu de données sur le disque, puis avec `--restore --persist` à chaque exécution suivante pour recharger l'existant et y ajouter les nouvelles lignes. Comme il conserve l'inode de chaque fichier et l'horodatage de la dernière ligne analysée, relancer sur un journal alterné ne comptera pas deux fois. Ajoutez `--keep-last` si vous préférez une fenêtre glissante à un historique perpétuel.
Related projects
UmamiWeb analytics open source et respectueux de la vie privée — une alternative auto-hébergeable à Google AnalyticsOpenPanelAnalytics produit open source et auto-hébergeable — une alternative à Mixpanel et Google AnalyticsPostHogAnalytique produit, relecture de session, feature flags et expérimentations en open source derrière un seul SDK — licence MIT hormis son répertoire ee, avec un palier gratuit mensuel par outilOpenStatusPage de statut et supervision de disponibilité open source dans un seul outil : auto-hébergeable, configurable comme du code, vérifié depuis 28 régions

You built it. Now grow it.

AgentCeres is a managed AI marketing team — specialists draft the SEO, social, and outreach that fill your links, you approve what ships. 14-day free trial, from $39/month.

Start free trialMore projects