Setting up lggr requires some surrounding tools:

  • syslog-ng (with syslog-ng-mod-sql extension module)
  • stunnel
  • mysql (MariaDB 10.1 used here)
  • apache
  • php 7.x (7.0 used yet)
  • composer (for initial setup)

And there is a difference betweeen setting up the central lggr server and configuring the multiple clients logging to it.



First create a database logger and run the db.sql script from the doc/db.sql source into it. It will create one major table, one server table, and four views. After that you have to create at least two mysql users with different rights: One for writing into the table and one for reading out of it. An example script doc/user.sql is included.

# create the following three mysql users:

# used by syslog-ng for inserting new data, referenced in /etc/syslog-ng/conf.d/08lggr.conf
GRANT INSERT,SELECT,UPDATE ON logger.* TO logger@localhost IDENTIFIED BY ‘xxx’;

# used by the web gui for normal viewing, referenced in inc/config_class.php
GRANT SELECT ON logger.* TO logviewer@localhost IDENTIFIED BY ‘xxx’;

# used by clean up cron job and for archiving, referenced in inc/adminconfig_class.php
GRANT SELECT,UPDATE,DELETE ON logger.* TO loggeradmin@localhost IDENTIFIED BY ‘xxx’;
GRANT SELECT,INSERT ON TABLE logger.servers TO loggeradmin@localhost;

# activate changes

Be sure to use your own strong passwords.

Change the values in the inc/config_class.php and inc/adminconfig_class.php files.


Create a file /etc/syslog-ng/conf.d/08lggr.conf containing:

options {

source s_net {
tcp( ip(“”) port(514) max-connections(20) log-iw-size(2000) );

destination d_newmysql {
session-statements(“SET NAMES ‘utf8′”)
columns(“date”, “facility”, “level”, “host”, “program”, “pid”, “message”)
values(“${R_YEAR}-${R_MONTH}-${R_DAY} ${R_HOUR}:${R_MIN}:${R_SEC}”, “$FACILITY”, “$LEVEL”, “$HOST”, “$PROGRAM”, “$PID”, “$MSGONLY”)

log {
source(s_net); source(s_src); filter(f_no_debug); destination(d_newmysql);

With that configuration syslog-ng logs its own local messages and the ones it receives via TCP from the net. As you can see we don’t just accept any external tcp connection but use some stunnel construct to only allow athenticated clients. In case of a plain internal network you might skip that step and listen on IP to get direct access.

Debian users might need some additional packages:

apt-get install syslog-ng-core syslog-ng-mod-sql
apt-get install libdbi1 libdbd-mysql

Depending on the linux/debian/syslog-ng versions you might have to enable one line within the file /etc/default/syslog-ng:



Just extract the files into your root web folder, i.e. /var/www/lggr and create a virtual host configuration. You have to adjust the database connection within inc/config_class.php to your needs. Use the read only mysql user.

To secure access to the gui it requires a configured basic authentication. In the root .htaccess file it references an example user file /var/www/webuser. Create it using some command like that:

htpasswd -c /var/www/webuser lggr

and enter a secure password.

For more security use a SSL/https connection to access the web gui.

The cache directory within lggr needs write permissions for the web user.


You need at least version 7.0, I’m developing using 7.0.33.


Creating a tunnel is somewhat more complex. You have to create a CA infrastructure with keys and certificates, distribute them to the clients and configure it correct.

For detailed information have a look at

To give some hints:

Enable the stunnel within /etc/defaults/stunnel and create a configuration file /etc/stunnel/stunnel.conf:

CAfile = /etc/stunnel/cacert.pem
CApath = /etc/stunnel/certs/

cert = /etc/stunnel/logserver_cert.pem
key = /etc/stunnel/logserver_nopwd_key.pem
pid =  /var/run/

verify = 3
debug = 5
accept =
connect =

Where ist your public external IP. Now the stunnel should listen on port 5140 to external connects and forward the decrypted connection to the local syslog tcp port. The path to your pid file might differ.



Create a file /etc/syslog-ng/conf.d/10lggr.conf with

destination d_net { tcp(“” port(514) log_fifo_size(1000)); };
log { source(s_src); destination(d_net); };


You should have these files:

  • cacert.pem (the personal root certificate of the logging server structure)
  • client_cert.pem (the signed certificate request)
  • client_npwd_key.pem (the private key for that client without password)

Reference to that files within a new configuration file /etc/stunnel/syslog.conf:

client = yes
CAfile = /etc/stunnel/cacert.pem
cert = /etc/stunnel/client_cert.pem
key = /etc/stunnel/client_nopwd_key.pem
verify = 2
debug = 5
accept =
connect =

Where the IP is the public external IP of your logging server again.

Cron jobs

You might be interested only in current log entries. To purge old messages run the admin/cron.php in hourly or daily intervals. You can create the file /etc/cron.d/lggr containing:

30 1 * * * www-data /usr/bin/php /var/www/lggr/admin/cron.php
* * * * * www-data /usr/bin/php /var/www/lggr/admin/cron_often.php

On default it keeps the last 4 weeks of entries. Otherwise just add the hours argument to the member function call within cron.php to your needs.

The second cron job admin/cron_often.php runs every minute and prepares server id/name relations.


To use a localized view your server must have installed the right locales. calling locale -a should list at least en_US.utf8 and maybe de_DE.utf8, add your personal translation as you wish.


63 responses to “howto”

  1. Matthias Krannich

    Hallo, Herr Kretschmann,

    vielen vielen Dank für Ihren syslog-Gui.

    Ich habe ihn eben in Betrieb genommen :),

    und folgendes ist mir dabei aufgefallen:

    In den Installationsvorraussetzungen wäre es m.E. noch sinnvoll,
    libdbd-mysql und php5-mysql mit aufzunehmen.

    in den Appache-Error-Logs kommen unwahrscheinlich viele Meldungen, ein Glück, dass das nicht ins syslog kommt:

    ca. 20…30 dieser Zeilen pro Web-Aktion:
    [Sun Jul 19 13:50:16 2015] [error] [client] PHP Notice: Use of undefined constant ENT_SUBSTITUTE – assumed ‘ENT_SUBSTITUTE’ in /var/www/lggr/index.php on line 280
    [Sun Jul 19 13:50:16 2015] [error] [client] PHP Notice: Use of undefined constant ENT_HTML5 – assumed ‘ENT_HTML5’ in /var/www/lggr/index.php on line 278

    das kommt nur einmal pro Web-Aktion:
    [Sun Jul 19 13:50:17 2015] [error] [client 10.xx.yy.yy] File does not exist: /var/www/img, referer: http://10.xx.xx.xx/lggr/

    das kommt evtl. durch Verwendung eines absoluten Pfades:
    root@zzz:/var/www/lggr# grep -r img *
    css/lggr.css:.navbar-brand img {
    root@zzz:/var/www/lggr# cd tpl/
    root@zzz:/var/www/lggr/tpl# vi
    root@zzz:/var/www/lggr/tpl# grep -r img *

    Nach Anpassung ist die Fehlermeldung weg und das Icon links oben da 🙂

    Eine Frage habe ich (u.a.) noch: Könnte man evtl. das Feld mit der syslog-Message größer oder “aufziehbar” machen?

    Vielen Dank

  2. Matthias Krannich

    und noch 2..3 Gedanken:

    bei dem oben aufgeführten Fehlern Use of undefined constant hilft höchstwahrscheinlich ein Update auf PHP 5.4

    ich mußte außerdem für das cache-Verzeichnis die Permissions hochschrauben:

    /var/www/lggr# ll -d cache/
    drwxr-xr-x 2 root root 4096 Jul 19 14:27 cache//

    chmod 777 cache/

    drwxrwxrwx 2 root root 4096 Jul 19 14:28 cache//

    vorher wurden die key_ files nicht angelegt:

    root@goliat5:/var/www/lggr/cache# ll
    total 20
    drwxrwxrwx 2 root root 4096 Jul 19 14:28 ./
    drwxr-xr-x 11 root root 4096 Jul 19 14:26 ../
    -rw-r–r– 1 root root 14 Jul 18 18:09 .htaccess
    -rw-r–r– 1 root root 0 Jul 18 18:09 index.html
    -rw-r–r– 1 www-data www-data 255 Jul 19 14:28
    -rw-r–r– 1 www-data www-data 180 Jul 19 14:28

    Jetzt kommt nur noch eine Meldung:
    [Sun Jul 19 14:28:20 2015] [error] [client xxx PHP Notice: Undefined index: warning in /var/www/lggr/index.php on line 144, referer:

    außer den sql-Abfragen.
    Kann man die evtl. auch nur im debugging-Fall einschalten?

    Einen schönen Start in die Woche
    M. Krannich

  3. Danke für das Ausprobieren und die Hinweise. Ich hab ein paar Sachen nun ergänzt in Doku und Code.

  4. david morrison

    Hi all,
    What version of syslog-ng are you using for this project? I currently have version 3.5.6 installed and when I attempt to start the service with the above contents of the /etc/syslog-ng/conf.d/08lggr.conf I get the following error:

    syslog conf.d # service syslog-ng restart
    [ ok ] Stopping system logging: syslog-ng.
    [….] Starting system logging: syslog-ngError parsing afsql, syntax error, unexpected ‘{‘, expecting ‘)’ in /etc/syslog-ng/conf.d/08lggr.conf at line 20, column 20:
    included from /etc/syslog-ng/syslog-ng.conf line 163, column 1

    values(“${R_YEAR}-${R_MONTH}-${R_DAY} ${R_HOUR}:${R_MIN}:${R_SEC}”, “$FACILITY”, “$LEVEL”, “$HOST”, “$PROGRAM”, “$PID”, “$MSGONLY”)
    any ideas?

    1. I’m running version 3.5.6 too. It seems you might miss the afsql module of syslog-ng itself. It can be an extra package like under debian (syslog-ng-mod-sql)

      ~# syslog-ng –version
      syslog-ng 3.5.6
      Installer-Version: 3.5.6
      Revision: 3.5.6-2+b1 [@416d315] (Debian/unstable)
      Compile-Date: Oct 1 2014 18:23:11
      Available-Modules: tfgeoip,afsmtp,afstomp,json-plugin,afprog,afamqp,afuser,afsql,linux-kmsg-format,afmongodb,csvparser,dbparser,afsocket-notls,afsocket,redis,cryptofuncs,system-source,confgen,affile,afsocket-tls,syslogformat,basicfuncs
      Enable-Debug: off
      Enable-GProf: off
      Enable-Memtrace: off
      Enable-IPv6: on
      Enable-Spoof-Source: on
      Enable-TCP-Wrapper: on
      Enable-Linux-Caps: on
      Enable-Pcre: on

  5. Christian

    Fehlende Hinweise in diesem “How-To”:
    Im Apache müssen die Module “Headers” und “Expires” aktiviert werden, sonst wird immer in der .htaccess abgebrochen!

    Die Seite lies sich bei mir nicht öffnen, da immer die Fehlermeldung kam, dass die redis__class.php nicht gefunden werden kann!
    Ich musste in der inc/lggr_class.php die Zeile
    $this->cache = new LggrCacheRedis();
    $this->cache = new LggrCacheFile();
    tauschen damit das funktioniert.

    Es fehlt der gesamte Ordner “contrib”, daher sieht die Seite nicht so schön aus, wie auf den Bildern und es wird nichts an Daten angezeigt:

    1. Die apache module stehen bei den System-Requirements drinnen. Ebenso ist dort der Download aller Fremdquellen als contrib-Archiv verlinkt. Alternativ kann man ja auch auf die live CDN Ablagen dieser Fremd-Lins verweisen.

      Das Howto hier liefert mehr das Zusammenspiel der Komponenten, nicht ihre Abhängigkeiten.

      Das Redis PHP Modul ist dann optional auch nötig, wenn man diese Art von Cache nutzen möchte.

  6. Peter Schulz

    Servus, seit geraumer Zeut produziert der syslog doppelte Einträge in der Datenbank. Dabei ist mir aufgefallen, das ich eigentlich eine Konfiguration mit fast identischen Inhalt an zwei Orte habe:

    Kann das der Grund sein? Mein System ist ein Centos 6. Welche der beiden Dateien soll ich umbenennen / verschieben, das es wieder nur eine Zeile pro Event gibt?

    Beste Grüße vom Bodensee,


    P.S.: an sich an tolles Produkt 🙂

    1. Welcher Syslog ist denn gemeint? Der auf dem zentralen Logging-Server oder der auf den Clients die zentral loggen wollen?

      bei den Clients habe ich die vorhandene /etc/syslog-ng/syslog-ng.conf eigentlich nie anpassen müssen. Dort habe ich nur in /etc/syslog-ng/conf.d/ eine z.B. 10syslognet.conf ergänzt mit

      destination d_net { tcp(“” port(514) log_fifo_size(1000)); };
      log { source(s_src); destination(d_net); };


      Und in der zentralen Konfiguration habe dagegen auch im conf.d Ordner eine eigene Konfiguration, die im wesentlichen den SQL Connect definiert und dann auch für das Logging setzt:

      filter f_no_debug { not level(debug); };

      destination d_newmysql {

      log {
      source(s_net); source(s_src); filter(f_no_debug); destination(d_newmysql);

  7. Manfred

    Genau sowas habe ich gesucht, PERFEKT! Vielen Dank dafür. 🙂
    Klein, schnell, schick und ressourcenschonend. Für ca. 10 Hosts benötige ich keinen ELK Stack mit Java.

    Die Installation ist zwar etwas holprig, man bekommt es aber hin. 😉
    (Debian 8.6, syslog-ng 3.5.6, PHP 5.6.29, MariaDB 10.0, Apache 2.4.10)

    Anpassen musste ich aber:
    ** /etc/syslog-ng/conf.d/08lggr.conf
    – als ersten Eintrag
    filter f_no_debug { not level(debug); };

    – hostname anstatt hostnames

    – Vorsicht beim copy & paste
    die ” und ‘ neu setzen

    – falls syslog-ng nicht startet, manuell im debug Modus starten, dann sieht man wo es klemmt.
    $ syslog-ng -Fevd

    ** inc/lggr_class.php
    – Redis auf File ändern
    $this->cache = new LggrCacheRedis();
    $this->cache = new LggrCacheFile();

    ** stunnel
    – nicht konfiguriert

    ** redis
    – nicht konfiguriert

    1. Manfred

      Noch einen bug gefunden:
      Unter Archived wird der export link nicht gefunden. Dort ist ein / zuviel. (URL /do.php not found)

      In der archived.php muss der / entfernt werden.
      # , export to csv.
      , export to csv.

      1. Der konnte mir nicht auffallen, da ich lggr als Subdomain laufen habe, die phps also alle in der root liegen. Da macht ein / mehr effektiv nichts aus. Ich werde es beim nächsten Checkin anpassen. Danke.

  8. Danke für die Anmerkungen. Es ist halt noch kein Setup wie bei großen CMS Systemen vorhanden. Aber da es sich ja eher an Sys-Admins richtet, sollte die Schwelle nicht zu hoch sein.

    Und diese dusseligen Gänsefüßchen haben mich auch schon mal erwischt.

  9. Manfred

    Hab heute mal unter Debian 9 mit PHP 7 installiert, läuft auch hier problemlos!
    (Debian 9.0, syslog-ng 3.8.1, PHP 7.0.16, MariaDB 10.1.21, Apache 2.4.25)

    Ich verstehe nur noch nicht ganz wie das mit dem Archivieren funktioniert. 🙁
    Wird das mit dem Picker beim Label aktiviert?

    1. Ja, das Archivieren setzt im Datenbankeintrag nur ein Flag, damit dieser nicht nach x Wochen aufgeräumt und weggelöscht wird. Ein Klick setzt das Flag per Ajax im Hintergrund, ein weiterer Klick setzt das wieder zurück. Die Archiv-Ansicht nutzt dann dieses Flag als Filter.

  10. Jörg


    kann man die Performance noch irgendwie verbessern? Bei >600k Einträge /h geht die Statistikfunktion nicht mehr … :o)

    Ausstattung sollte hoch genug, Load des Server ist nicht so groß (4 x 2,7Ghz && 32GB RAM) – CPU bei 3% & RAM bei ~50% Auslastung / 10MB/sec HDD bei 0,4ms Latenz). Gibt es stellen wo man evtl. noch dran schrauben kann? Die Suche braucht ca. 20s bis die etwas gefunden hat.

    Wir haben aktuell 2 x DC, 1 Fileserver (mit File-/Zugriffs-Audit), Exchange Server sowie einen Router der Daten an den Logserver liefert.

    Hat vielleicht jemand einen Tipp ob oder wie man die Leistung verbessern könnte? Das ganze läuft auf Debian 9 als VM unter VMware 6.

    Danke und Gruß

    1. Wenn bei der Statistik nichts kommt, würde ich erst mal versuchen die erlaubte php Laufzeit oder ggf. den erlaubten Speicher zu erhöhen, je nach Fehlermeldung, falls die zu finden ist.

      Ansonsten ist das lggr Tool noch eine sehr flache DB Struktur. Da werde ich ggf. mal (wenn wieder Zeit ist) was normalisieren.

  11. Oliver Rüßel

    Guten Morgen zusammen,
    ich habe versucht die Anleitung entsprechend auf RHEL7 mit httpd, MariaDB und PHP 5.6 zu adaptieren. Hat soweit auch funktioniert.
    Aktuell erhalte ich beim betreten der live.php folgende Meldung
    PHP Notice: Undefined variable: searchvalueprog in /var/www/html/tpl/ on line 21

    Die Programm Suche an sich funktioniert. Kennt von euch jemand den Fehler ?

  12. Die “Notice” kann im aktuellen Stand noch kommen. Die optionalen Argumente muss ich noch durchgehender auf Existenz abfragen. Ist mir letztens auch aufgefallen.

  13. TBC

    Hallo wertes Team,

    besteht die Möglichkeit der Erweiterung des Filterings oder auch Suche auf Host Systeme?

    Vielen Dank im Voraus.

    1. Klar, erweitern geht immer, gerade auch weil es PHP ist.
      Entweder einfach selber zur Feder greifen und das Teil forken, oder ein paar Beispiele scribbeln was noch fehlt. Dann kann ich das gelegentlich mal erweitern.

  14. Andre French

    Bei mir lief die Statistik-Seite auch nicht auf Anhieb. Habe dann festgestellt, dass der Browser Content-Security-Policy Fehlermeldungen lieferte.
    Der Grund dafür ist dieser:
    Wenn auf der stats.php-Seite Resourcen wie JavaScript, CSS und Schriftarten von externen Seiten wie und aus dem Browser heraus geladen werden sollen, muss bei aktuellen Browsern noch die “Content-Security-Policy” in .htaccess um diese Seiten ergänzt werden.

    Header always set Content-Security-Policy “default-src ‘self’ ; script-src ‘self’ ‘unsafe-eval’; style-src ‘self’ ‘unsafe-inline’; img-src ‘self’; font-src ‘self’; report-uri;”

    1. Ich habe da ja beide Alternative vorgesehen, das Laden der 3rd party Quellen von extern und das lokale ablegen selbiger.
      Die zweie Variante gefällt mir persönlich besser und dabei kann man dann auch den CSP Header sinnvoll einschränken.
      Beim Laden von extern ist das mit CSP fast ohne Mehrwert und man könnte das auch weglassen.

      1. Bueddy


        ich versuche die JavaScripts Local einzubinden, aber die Statistik Seite zeigt nichts an, es gibt auch keine Fehler.
        PHP Timeouts und Memory sind auch erweitert.

        Hebe 320k Einträge in der DB.

        Vielen Dank und Gruß

        1. Da würde ich bei z.B. Firefox mal die webmaster tools des Browser mitlaufen lassen und den Netzverkehr anschauen.
          Die Statistik lädt ihre Daten als JavaScript Aufruf nach, der aber aus php heraus generiert wird. Diesen Link sollte man als erster mal im Inhalt prüfen, ob da auch Daten kommen, oder doch nur ein Fehler den der Browser dann nicht weiter darstellt.

          1. Bueddy

            Das hat geholfen den Fehler zu finden.
            Ursache waren meine UniFi Access Points mit den eckigen Klammern.

            Vielen Dank noch mal!

  15. Fabian

    Hallo Herr Kretschmann,

    ich habe beim Archivieren folgendes Problem: Sobald die CSV mit Daten gefüllt ist, funktioniert das exportieren nicht mehr und die Datei kann nicht gefunden werden Pfad: “/logger/do.php?a=exportarchive”.

    Wenn die CSV leer ist funktioniert das Exportieren einwandfrei.
    Wissen Sie eventuell woran dies liegen könnte?

    Vielen Dank im Voraus
    Gruß Fabian

    1. Die CSV wird bei mir beim download mit einem Namen wie lggrarchive_20180405.csv benannt. Kann aber vom Browser abhängen.
      Wenn der Name wikrlich so inkl. Fragezeichen sein sollte, dann stimmt was nicht und das es dann Fehler geben kann glaube ich.

  16. Bernd


    just installed it on Debian 9
    I had to add

    lower_case_table_names = 1



    because the tablenames in db.sql are all in lowercase, but the php code
    uses mixed letters.

    Also I need to use the contrib file, since jqcloud and some versions are no longer active.

    1. Thanks for the fix. I’ll try to include it in the main source branch later.

  17. Bernd


    found a small bug


    define(‘COLORALERT’, ‘d9534f’);

    should be:
    define(‘COLORALERT’, ‘#d9534f’);

    Than the err messages are shown in red 🙂

  18. Manfred

    Archivieren funktioniert nicht. Kein Dreieck beim gesetzten Picker Symbol.

    Im Google Chrome Debugger (F12) sieht man den Fehler:
    POST http://LGGR-SERVER/do.php?a=archive 404 (Not Found)

    In der Datei “js/lggr.js” stimmen zwei Pfade zur do.php nicht! Statt /do.php muss es ./do.php sein

    $(‘div.datablock’).on(‘click’, ‘span.lggr-archived’, function() {
    /* url: ‘/do.php?a=unarchive’, */
    url: ‘./do.php?a=unarchive’,

    $(‘div.datablock’).on(‘click’, ‘span.lggr-notarchived’, function() {
    /* url: ‘/do.php?a=archive’, */
    url: ‘./do.php?a=archive’,

    Nach den Änderungen funktioniert es! 🙂

  19. Daniel

    Hallo, die Statistik-Seite bleibt bei mir leer. Ich finde den Fehler nicht. Bitte um Unterstützung.

    1. Da müsste in der Konsole vom Browser irgendein Fehler auftauchen. Sicher ein fehlendes externes Javascript oder so. Ohne weitere Angaben sucht es sich da wirklich schwierig.

  20. Christopher

    gibt es eine Möglichkeit bestimmte einträge zu ignorieren?
    Zum Beispiel vom Windows Server kommen abertausende von EInträgen aus “Security” (an und abmeldung von Konten) die fluten einem den Syslog, das er wirklich unübersichtlich wird.

    1. Ein Filtern schon beim Abspeichern/Empfangen der Meldungen ist noch nichg vorgesehen. Da ich selber nur innerhalb von Unix protokolliere, hatte ich solches schon im sendenden Syslog server konfiguriert. Das kann der Windows Dienst wahrscheinlich nicht. Aber eine einfache negativ Liste wäre eine Idee.

  21. Jonas

    Hallo Kai,

    zum Leer bleiben der Statistik Seite waren ein paar Kommentare hier ein guter Tipp. Ich habe dann auch mal mit der Firefox Developer Konsole nachgeschaut, bei mir waren es auch eckige Klammern und Anführungszeichen in den Server Namen. Gegen die eckigen Klammern kann man erst mal nicht viel tun, gegen die Anfürungszeichen und ein paar andere ungewollte (JavaScript) Steuerzeichen aber relativ einfach.

    Um dies zu beheben habe ich in der Datei lggr_stat_data.php die entsprechenden Ausgaben mit den escape Befehlen von PHP etwas entschärft, somit sollten solte Fehler weniger auftreten. Folgende Zeilen habe ich geändert/ergänzt:

    Zeile 72 geändert in:
    $aTmp[addslashes($server->host)] = $server->c;

    Zeile 107 eingefügt:
    $host = addslashes($server->host);

    Zeile 102 (vor dem obigen einfügen):
    label: “{$host}”

    1. I was expecting plain server names, not any names with special chars. But if that is used in reality I’m glad for any patch. If anyone has more time than me, feel free to go to my git server and make some updates/forks/pull/changes however.

  22. Jochen

    vorab vielen Dank für die geniale Software. Besonders gefällt mir die Einfachheit in der Bedienung!!

    Besteht die Möglichkeit Logeinträge zu exportieren? (z.B. als csv)
    Auf der Archiviert Seite wird mir dazu ein Link angezeigt, jedoch leider nicht auf der Ansicht..

    1. Danke und ja, das ist richtig. Export is bislang nur in der “Archiviert” Ansicht verfügbar. Aber es sollte nicht schwer sein das auch für die normale Ansicht zu etablieren. Da würde ich es nur auf irgendeine Menge beschränken, da sonst das CSV riesig wird. Also z.B. nur die aktuelle Seite mit 200 Einträgen.

  23. Jochen

    In der Echtzeit-Ansicht macht es tatsächlich Sinn, die Werte auf eine bestimmte Anzahl zu beschränken.
    In der fände es sinnvoll, alle Einträge zu exportieren die vom User anhand der “Filtern” Einstellungen selektiert wurden.
    Über ein Update würde ich mich sehr freuen!

  24. Bernd

    Warning: Invalid argument supplied for foreach() in /logger/tpl/ on line 8

    any ideas?

    1. Bernd

      strange for unknown reasons the error is gone.
      but still displays:

      You must enable basic authentication

      even though i have it enabled!

  25. Bin ich der einzige, bei dem, in der Echtzeitansicht, die letzten Einträge wiederholt werden, sobald sich die Webseite automatisch aktualisiert?

    Aktualisiere ich das Fenster manuell, ist alles ok.

    @Kai Kretschmer

    Ein paar der dort markierten Fehler sind noch aktuell (mWn die fehlende Raute vor der Farbe sowie die Vermischung von Groß und Kleinschreibung im Code)

    Ich habs mal versucht in meinem Fork zu zeigen und mich auch noch am install Skript versucht. Ich hab mich allerdings noch nicht mit deinem gitea auseinandergesetzt, da es bei mir Franz. ist. :’)

  26. Steffen

    @Kai Kretschmann
    Hi there, great tool you are providing, loving it!
    Thanks to you and all contributers for the time and effort that was already put into this.

    I have setup a working logger environment on my raspberry pi running three docker containers (lggr, maria-db, syslog).
    Reworked from the following tutorial:

    It is up and running with most of it’s core functions as it should, but some features are not working…

    What bugs me most is, that the stats page is not fully functional. The wordcloud (jqcloud) and the database stats are the only stats displayed, the other four diagrams are missing.

    But when I open the console in Chrome I see no errors.
    When I open the console in Firefox I am presented with the following warnings/errors:
    “Diese Seite verwendet die nicht standardisierte Eigenschaft “zoom”. Stattdessen sollte calc() in den entsprechenden Eigenschaftswerten oder “transform” zusammen mit “transform-origin: 0 0″ verwendet werden.”
    “Content Security Policy: Die Einstellungen der Seite haben das Laden einer Ressource auf inline blockiert (“script-src”).”

    The first one is a warning which I would ignore, the second one I tried to get rid of but had no luck so far.

    I cloned your gitea master branch and copied the provided dependency package for the installation.

    An idea that came to me while writing this post, I used an alpine image to build the lggr container, could it be there are some dependencies missing for the js plugins?

    Could you help me getting it running as it should?

    1. Hi,

      first I would try to comment out the ContentSecurityPolicy part, restart the webserver and try it again. It might be to strict sometimes.

      And I see it is time for a general update, a package from 2015 seems a bit aged. Sorry for that, but currently I’m on totally different topics workwise.

  27. Christoph

    Hallo Herr Kretschmann,
    Super Tool, genau was ich gesucht habe. Installation war etwas holprig bei mir.
    Ich verwende nginx anstatt Apache. Hier wird wohl die “Basic Auth” nicht erkannt. Ich habe daraufhin den Teil in der Konfig auskommentiert. Jetzt wird die Seite angezeigt. Verwende es eh nur lokal – nicht schön aber passt erst mal.
    Auch verwende ich einen MySQL Server auf einem anderem Server. Den DB-Host fest im Script einzubinden und nicht auch in der Konfig zu pflegen ist nicht ganz so ideal.


    1. nginx ist noch nicht direkt unterstützt, kommt dann aber auch auf meine TODO Liste für Doku und automatische Installation.

  28. Franz Matthies

    Hallo Herr Kretschmann,

    vielen Dank für diese Hervoragende moderne Syslog GUI.
    Eine Frage habe ich allerdings. Wäre es möglich bei den Suchen auch das Suchen nach Host und Log-Level zu ermöglichen? Im Moment sehe ich nur Programm und Message als Suchfelder. Habe ich da vielleicht etwas falsch gemacht?

    Gruß Franz Matthies

    1. Nach Host suchen geht schon, dazu muss der Suchblock oben nur aufgeklappt werden und man sollte eine Liste der Server aufklappen können. Ein Klick und er filtert danach.

      1. Franz Matthies

        Hallo Herr Kretschmann,

        Dann muss ich bei der Einrichtung irgendwas übersehen haben. Der Server “DropDown” ist zwar da aber leider leer. So das ich keine Server auswählen kann. Haben Sie vielleicht einen Tipp wo ich schauen könnte um den Fehler zu finden?

        Vielen Dank Franz Matthies.

  29. C3rebro


    I got the issue with messages that could not be written. That caused the syslog-ng to repeatedly restart and de-facto non-responsive.

    @Kai Kretschmann: Some devices (esp. firewalls) will use a pid like “nnnnn.nnnnn”. This will lead to an mysql error when trying to insert a non integer that looks like so:

    “Error running SQL query; type=’mysql‘, host=’localhost‘, port=“, user=’logger‘, database=’logger‘, error=’1366: Incorrect integer value: \’\‘ for column `logger`.`newlogs`.`pid` at row 1′, query=’INSERT INTO newlogs (date, facility, level, host, program, pid, message) VALUES (\’2020-03-05 00:00:10\‘, \’kern\‘, \’alert\‘, \’\‘, \’srv-lrt214\‘, \’\‘, \’kernel: #warn ACCESS_RULE: IN=eth0 SRC= DST= LEN=76 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=23533 DPT=32100 LEN=56 \‘)‘”

    i altered the row datatype from int to varchar with mysql console:

    alter table newlogs change pid pid varchar(50);

    1. In the develop branch I updated the pid field in a similar way.

  30. Krammer Andreas


    ich habe alles so installiert wie sie es beschrieben haben und es klappt eigentlich ganz gut. Vielen Dank hier mal für die tolle Arbeit.

    Ich habe nur einen Schönheitesfehler und wollte nachfragen, ob sie mir dabei helfen könnten. Wenn ich den Menüpunkt “Statistik” aufrufe, funktioniert dieser nicht. Das Design des Seite ist weg, als ob irgendwas nicht gefunden wurde und die Seite ist bis auf die Menüpunkte, welche einfach untereinander stehen leer und ohne Funktion.

    Habe ich hier etwas falsch gemacht?


    1. Der Statistik Teil nutzt viel Javascript und generiertes JS aus PHP heraus.
      Ohne eine Fehlemeldung im Quelltext oder im error log des servers ist das schwer zu sehen.

      Bei viel Daten kann es auch einfach lange dauern an dieser Stelle.

      1. Krammer Andreas

        können sie mir im Detail bitte sagen, wo ich nachsehen soll. Bzw. könnten sie mich dabei unterstützen?

  31. J. Bollmeyer

    Guten Tag,
    auch bei mir ist das Server Feld im Filter Bereich leer.


    1. Hallo,

      ist der cron job denn schon mal gelaufen?
      Die Statistik und eine Liste der Server wird nämlich nicht in Echtzeit jedesmal neu erzeugt, sondern vom cron job vorbereitet.

  32. Patrick S.

    Guten Tag,

    Ich hab folgendes Problem:
    Da mein Log inzwischen 4837 Seiten enthält möchte ich die Suchfunktion nutzen.
    Leider ist es nicht möglich mehrere Seiten des LOGs durchzusehen mit einer Suche über “Search in messages”. Es wird maximal eine Seite des Logs ausgegeben wobei es sicher mehrere Seiten sein müssen.
    Gibt es hierfür eine Lösung?

    Besten Dank

  33. Thoralf Geese

    Hallo, vielen Dank für das super Tool. Wie kann ich die Basic AUTH abgschalten? Sobald ich das im Apache deaktiviere dann kommt bei der Webseite “Basic AUTH” muss aktiviert sein.

    1. Thoralf Geese

      habs gefunden. Den Bereich in der lggr_class.php auskommentiert.

  34. Krammer Andreas


    ich habe es installiert und es läuft sehr gut. Allerdings werden keine Einträge archiviert. Im Moment sind ca. 8 Mio Einträge in der Datenbank und daher ist diese schon sehr langsam. Was kann ich hier denn machen?


    1. Das archivieren ist nicht gleich dem Löschen alter Einträge!

      Archivieren ist im Gegenteil das manuelle markieren in der GUI, damit der Eintrag nicht (später) gelöscht wird.

      Das Löschen geschieht mit zwei cron jobs, die ich z.B. so auf rufe (im /etc/cron.d/lggr)

      30 1 * * * www-data /usr/bin/php /var/www/lggr/admin/cron.php
      * * * * * www-data /usr/bin/php /var/www/lggr/admin/cron_often.php >/dev/null

      Die erste Zeile löscht jeweils die alten Einträge und die zweite Zeite (läuft öfter) macht die Aktualisierung der Statistik und der Server Liste.

      Das Löschen basiert auf der Variablen MaxAge in den lokalen config Einträgen (Ich glaube das waren Stunden, muß ich im Source erst nachschauen)