GoAccess
Echtzeit-Analysewerkzeug für Webserver-Logs, das im Terminal läuft oder ein eigenständiges HTML-Dashboard in einer einzigen Datei erzeugt
GoAccess ist ein quelloffener, MIT-lizenzierter Log-Analysator in C, der das Zugriffsprotokoll deines Webservers liest und zeigt, was dein Server tatsächlich ausgeliefert hat — als interaktives Dashboard im Terminal oder als einzelne, in sich geschlossene HTML-Datei, die du jemandem per Mail schicken könntest. Er versteht Logs von Apache, Nginx, Caddy, CloudFront, S3, Elastic Load Balancing, Traefik und IIS von Haus aus, dazu jedes eigene Format, das du beschreibst, und braucht zum Laufen nur ncurses. Am 2. September 2026 hatte er 20.890 GitHub-Sterne. Für Gründerinnen und Gründer beantwortet er eine enge Frage sehr gut: Was wurde angefragt, was hat dein Server geantwortet und wie lange hat es gedauert — einschließlich der Anfragen, die dein JavaScript nie ausgeführt haben.
Was GoAccess tatsächlich ist
GoAccess github.com/allinurl/goaccess wird seit 2013 gepflegt und ist in C geschrieben, was sich in dem zeigt, was einem zuerst auffällt: genau eine zwingende Abhängigkeit, ncurses, und ein sofortiger Start. Zeig ihm ein Log — `goaccess access.log` — und du hast ein interaktives Dashboard im Terminal. Mit `-o report.html --real-time-html` schreibt er zusätzlich eine einzelne HTML-Datei ohne externe Abhängigkeiten und schiebt Live-Aktualisierungen über einen WebSocket-Server dorthin, den er selbst mitbringt, standardmäßig auf Port 7890.
- Er liest das Logformat, das du ohnehin hast Apache common und combined, Nginx, Caddys strukturiertes JSON-Format, Traefik, Squid, W3C von IIS, Amazon CloudFront, S3, Elastic Load Balancing und Google Cloud Storage sind vordefiniert. Alles andere beschreibst du mit einer eigenen Formatzeichenkette.
- Er läuft dort, wo das Log liegt, oder dort, wo du bist Er verarbeitet Dateien, ganze Sätze rotierter und komprimierter Dateien über `zcat --force`, oder die Standardeingabe. Du kannst ihn also gar nicht erst auf dem Server installieren und stattdessen vom Laptop aus `ssh -n you@server 'tail -f /var/log/nginx/access.log' | goaccess -` ausführen.
- Er hält Historie ohne Datenbank `--persist` schreibt den Datenbestand auf die Platte, `--restore` lädt ihn zurück und hängt Neues an. Er merkt sich die Inode jeder Datei und den Zeitstempel der zuletzt gelesenen Zeile, sodass ein erneuter Lauf nicht doppelt zählt, und `--keep-last=5` gibt Speicher frei, der älter als fünf Tage ist.
- Er gruppiert Traffic so, wie Betreiber denken Panels für Anfragen, 404er, statische Dateien, Bandbreite, Antwortzeit, Verweisquellen und virtuelle Hosts, dazu — mit der optionalen MaxMind-Datenbank — Geografie und ASN, also genau das Panel, das ein einzelnes lautes Netz sofort sichtbar macht.
- Er wird weiterhin aktiv entwickelt Der jüngste Tag ist v1.11 vom 15. Juli 2026, und die Commits der letzten Augusttage 2026 sind gewöhnliche Produktarbeit: eine eigene Kategorie für KI-Crawler, Fediverse-Traffic von Crawlern getrennt, Ausschluss von Traffic nach ASN, UTM-Kampagnenauswertung anstelle des alten Keyphrase-Panels und eine Live-Metrik für Anfragen pro Sekunde.
Die Lizenz ist ein schlichtes MIT, festgehalten in der Datei COPYING des Repositorys statt einem Abzeichen überlassen. Es gibt 449 offene Issues, was für ein dreizehn Jahre altes C-Projekt, das jedes je erfundene Logformat verarbeitet, eher nach Nutzung als nach Vernachlässigung klingt: Ein großer Teil davon sind Fragen zu Log-, Datums- und Zeitformaten, und die README verweist direkt auf die mehreren hundert bereits geschlossenen.
Was der Betrieb kostet
Der eigentliche Preis ist nicht Rechenzeit, sondern Zugang. Du musst das Zugriffsprotokoll überhaupt lesen können, was ihn auf den meisten verwalteten Plattformen ausschließt, wo du nie eines zu sehen bekommst. Du musst dein Logformat kennen, und hier geht die Zeit wirklich hin: Ein Auseinanderfallen zwischen dem Datumsformat deines Logs und der Locale, unter der GoAccess läuft, ist der mit Abstand häufigste Grund dafür, dass der erste Lauf nichts anzeigt. Und du musst dich früh für oder gegen Persistenz entscheiden, denn ohne `--persist` ist dein Bericht nur so alt wie die Datei, die du übergeben hast, und die Logrotation löscht deine Historie nach einem Zeitplan, den jemand anderes gewählt hat.
Dafür bekommst du ein Werkzeug ohne Konto, ohne Tag, ohne Stichproben und ohne monatliche Rechnung, das binnen Sekunden nach der Anfrage antwortet. Produktanalytik ist es ausdrücklich nicht: Es hat keine Vorstellung davon, wer ein Nutzer ist, was er geklickt hat oder ob er nächste Woche wiederkam. Es ist die Schicht darunter, und beide beantworten unterschiedliche Fragen gut genug, dass die meisten Teams, die eines betreiben, am Ende beide betreiben.
Wo ein Log aufhört, die Wahrheit zu sagen
Ein Log-Analysator ist exakt so wahrhaftig wie das Log, und der schnellste Weg, dein Log daran zu hindern, deinen Traffic zu beschreiben, ist ein CDN davor. Genau das haben wir im August 2026 auf agentceres.com getan, und die Wirkung auf den Ursprungsserver war alles andere als subtil: Der Seiten-Cache, den unser Ursprungsprozess hielt, fiel von 1,33 GB auf 0,31 GB, weil die meisten Anfragen schlicht nicht mehr ankamen. Jeder dieser am Edge ausgelieferten Treffer ist ein echter Besuch, den das Log des Ursprungsservers nie enthalten wird.
- Ein CDN davor. Zwischengespeicherte Antworten gehen am Edge raus, dein Ursprungs-Log enthält also die Fehlschläge des Caches. Lies für das ganze Bild die Logs des CDN selbst, oder wisse, dass du Cache-Misses misst, und sag es dazu.
- Logrotation. Die Voreinstellung der meisten Systeme hält ein bis zwei Wochen vor. Alles, was du nicht persistiert hast, ist weg, und es geht ohne jede Fehlermeldung.
- Ein Proxy oder Load Balancer. Ohne konfigurierten forwarded-for-Header scheint jede Anfrage von einer einzigen internen Adresse zu kommen, und deine Panels für Geografie und ASN werden zur Dekoration.
- Statische Dateien und Health Checks. Ein Treffer ist kein Seitenaufruf. Filtere auf die Anfragen herunter, die du wirklich meinst, bevor du jemandem eine Zahl nennst.
Den Wert, das Rohmaterial zu lesen, haben wir auch in die andere Richtung gelernt. Drei Stunden unseres eigenen Ursprungs-Logs enthielten 1.438 Anfragen auf 558 verschiedene URLs — 2,58 Treffer je URL — und rund drei Viertel davon war Rechenzentrums-Traffic mit gefälschten oder leeren User Agents. Nichts von diesem Verhältnis war in unserer JavaScript-Analytik zu sehen, weil fast nichts davon JavaScript ausführt, und es beendete eine Diskussion, die wir wochenlang geführt hatten: warum eine zweistündige Cache-Lebensdauer auf einer Long-Tail-Inhaltsseite so wenig brachte. Die ausführliche Fassung dieses Arguments steht in unserem Beitrag darüber, wie viel deines Website-Traffics Bots sind.
Wo es hingehört, wenn du wachsen willst
Der Wachstumsnutzen ist enger als der volle Funktionsumfang und lohnt eine genaue Benennung. Erstens die Realität des Crawlings: Welche Seiten Googlebot und die KI-Crawler tatsächlich geholt haben, wie oft und mit welchem Status — ein 404 in deinem Log ist meist ein Link, den jemand auf eine von dir verschobene Seite veröffentlicht hat. Zweitens das Verweisquellen-Panel, das eingehende Links auffängt, bevor irgendein Backlink-Werkzeug sie bemerkt. Drittens die Antwortzeit je Anfrage, denn eine Seite, die nur für echte Besucher langsam ist, bleibt in einem synthetischen Test unsichtbar. Dass das Projekt Ende August 2026 eine eigene Kategorie für KI-Crawler eingeführt und Fediverse-Traffic abgetrennt hat, ist ein ordentliches Zeichen dafür, dass der erste Punkt inzwischen eine Frage vieler Leute ist.
Nichts davon ist die Wachstumsarbeit selbst, und hier liegt die ehrliche Grenze jedes Messwerkzeugs: Ein Log sagt dir, was passiert ist, und nie, was du deswegen tun sollst. Die Seite zu veröffentlichen, wegen der der Crawler kam, die Ansprache zu schreiben, die diese Verweisquelle verdient, den 404 zu reparieren, der dich still einen Link gekostet hat — all das muss weiterhin jemand tun. Dafür gibt es AgentCeres — den AI Growth Officer auf agentceres.com: ein Team von Fachrollen, das die Arbeit entwirft, während ein Mensch alles freigibt, was nach außen geht. Wenn du noch davor stehst und die Frage schlicht lautet, warum niemand ankommt, beginne mit warum deine Website keinen Traffic bekommt.
FAQ
- Ersetzt GoAccess Google Analytics oder Plausible?
- Nein, und es als Ersatz zu behandeln ist der Weg zur Enttäuschung. Ein Tag-basiertes Werkzeug folgt einer Person durch eine Sitzung und kann sagen, was sie geklickt hat und ob sie wiederkam. GoAccess liest, was von deinem Server verlangt wurde und was er geantwortet hat, ganz ohne den Begriff eines Nutzers. Die Überschneidung ist ungefähr die Zahl der Seitenaufrufe, und selbst die wird abweichen, denn ein Log zählt Anfragen, die nie JavaScript ausgeführt haben, und ein Tag zählt Sitzungen, die dein Ursprungsserver vielleicht nie gesehen hat.
- Kann ich es nutzen, wenn meine App auf einer Plattform ohne Log-Zugriff läuft?
- Meist nicht direkt, und das ist das Erste, was du prüfen solltest, bevor du Zeit investierst. Wenn du kein Zugriffsprotokoll lesen kannst, ist dein Gegenstück der Log-Export deines CDN, sofern es einen hat, oder das Anfrageprotokoll der Plattform selbst. Manche Anbieter können Logs in eine Datei schreiben, die du weiterleiten kannst, und das funktioniert gut: GoAccess liest problemlos von der Standardeingabe und es ist ihm gleich, woher die Zeilen kommen, solange du ihm das Format nennst.
- Wird ein stark belasteter Server dadurch langsamer?
- Er liest die Logdatei, statt im Anfragepfad zu sitzen, kann eine Antwort also nicht so verzögern, wie es ein Agent im Prozess könnte. Bei einem großen Rückstand ist das Parsen selbst der einzige echte Aufwand, und die Vorschläge der README decken ihn ab: mit `nice` bei niedriger Priorität laufen lassen, `--jobs` für mehrfädiges Parsen nutzen und `--chunk-size` über den Standard anheben. Die andere Möglichkeit ist, ihn gar nicht auf dem Server laufen zu lassen und das Log per SSH auf die eigene Maschine zu leiten.
- Wie behalte ich mehr als eine Woche Historie?
- Indem du sie persistierst. Lauf einmal mit `--persist`, um den Datenbestand auf die Platte zu schreiben, und danach bei jedem weiteren Lauf mit `--restore --persist`, um das Vorhandene zu laden und die neuen Zeilen anzuhängen. Weil er die Inode jeder Datei und den Zeitstempel der zuletzt gelesenen Zeile speichert, zählt ein erneuter Lauf über ein rotiertes Log nicht doppelt. Ergänze `--keep-last`, wenn du ein gleitendes Fenster statt alles für immer willst.
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.