Anleitung: Zentraler Logserver mit Syslog NG, MySQL und Lggr Webinterface

Heute zeige ich euch wie man Lggr zusammen mit einer Datenbank, einem Webserver und Redis zu einem mächtigen Logviewer als performante alternative zu Elasticsearch oder Splunk machen kann.

Einige kennen es vielleicht. Man hat mehrere Server, etliche Applikationen oder Websites und alle schreiben brav die Meldungen in ein eigenes Logfile. Unter Umständen auch noch auf verschiedenen Servern und dann kommt der Gau.

Die einzelnen Logs auf den Servern durchzustöbern kann dann sehr Mühsam und langwierig sein aber auch die tägliche Überwachung auf Ungereimtheiten kann auf manuellem Weg sehr mühsam sein. Ein anderes Szenario, man ist irgendwo unterwegs, irgendwas fällt aus und es muss schnell gehandelt werden. Dabei hat man vielleicht nur ein Handy.

Wäre es hier nicht wunderbar ein Webinterface zu haben, was irgendwo mitlaufen kann und die Logeinträge ausgibt? Genauso das wollen wir hier nun tun. Ein Webinterface welches uns die Logs anzeigt und durchsuchen lässt.

Das Konstrukt von Backend bis Webinterface

Ziel soll es sein ein Webinterface für alle Logfiles von allen Servern zentral anzeigen zu lassen, dort suchen und Filtern zu können um Fehler schnell und effizient beheben zu können. Zum Einsatz kommt hier das Webinterface von Lggr. Zudem benötigen wir einen Apache, Redis als Caching sowie eine MySQL Datenbank als Backend. Am Ende sollte dann so ein schönes Loggr Webinterface dabei herauskommen.

lggr
Auf dem Screenshot sieht man die Statistik Seite unseres Lggr Webinterfaces mit 35,5 Millionen Einträge seit 12. Dezember 2017. Die Ladezeit beträgt ca 3-8 Sekunden. Recht ordentlich für diese Masse 😉

Auf dem Screenshot sieht man einen Teil der Statistik Seite unseres Lggr Webinterfaces mit 35,5 Millionen Einträge seit 12. Dezember 2017. Die Ladezeit beträgt ca 3-8 Sekunden. Recht ordentlich für diese Masse 😉

Dann kommen wir aber endlich zum Wesentlichen. Der Installation die wir im Folgenden Artikel genau erklären.

Die Apache Installation

Die ist relativ Simpel erledigt und war in weniger als 5 Minuten auf unserem Debian Stretch System erledigt.

apt-get install apache2

a2enmod headers expires

Damit wird Apache installiert und die benötigten Module aktiviert.

PHP installieren

Natürlich wird auch PHP benötigt. Bei Debian Stretch gibt es PHP 7 per Default

apt-get install php php-mysql

Nun noch in /etc/php/7.0/apache2/php.ini und in /etc/php/7.0/cli/php.ini eure Zeitzone setzen.

date.timezone = Europe/Berlin

Redis installieren als Caching

Damit das ganze nun auch performant ist und nicht ständig alle Anfragen direkt den Apache / PHP oder MySQL belasten, installieren wir Redis als Caching Backend

apt-get install php-redis redis-server

Solltet Ihr kein Redis benötigen oder wollen, dann könnt Ihr in der lggr_class.php von LggrCacheRedis zu LggrCacheFile ändern.

Sieht dann so aus

// $this->cache = new LggrCacheRedis();

$this->cache = LggrCacheFile

 

Lggr Webinterface

Da gibt es nun 2 Wege, entweder ihr holt euch das Original und ladet die 3rd Party Bibliotheken wie jquery und Bootstrap extra herunter oder Ihr nehmt unseren Download. Dort sind die 3rd Party Bibliotheken und ein paar Fixes im Design bereits mit enthalten. 

Variante 1: Hier Downloaden, entpacken und mit den Anpassungen weiter unten fortfahren.

Variante 2: Mehr Aufwand aber dennoch will ich diese nennen.

cd /var/www/html

apt install -y git

git clone https://github.com/kkretsch/lggr.git logger

cd /var/www

wget https://lggr.io/wp-content/uploads/2015/06/lggr_contrib.tar.gz tar xvfz lggr_contrib.tar.gz

Egal welche Variante. Ab hier geht es in jedem Fall weiter 🙂 Das Webinterface sollte unbedingt gesichert werden da hier kein Login verbaut ist. Am einfachsten mittels htaccess

 htpasswd -c /var/www/webuser logger 

Damit wird dem User “logger” ein Passwort erstellt mit dem man sich später im Webinterface einloggen kann.

In der Apache config sollte man noch .htaccess Auswertungen erlauben

$ /etc/apache2/sites-available/000-default.conf

<VirtualHost>

---SNIP---

        <Directory /var/www/html/>

        AllowOverride All

        </Directory>

</VirtualHost>

Nun noch die Rechte setzen

chown www-data:www-data /var/www/html/logger/cache/

In der inc/config_class.php muss auf den contrib Ordner verwiesen werden. In Variante 2 müssen hier die Pfade angepasst werden

/* local storage */

               $this->setUrlBootstrap('/contrib/bootstrap/');

               $this->setUrlJquery('/contrib/jquery/');

               $this->setUrlJqueryui('/contrib/jqueryui/');

               $this->setUrlJAtimepicker('/contrib/timepicker/');

               $this->setUrlChartjs('/contrib/chartjs/');

               $this->setUrlJQCloud('/contrib/jqcloud/');

MariaDB / MySQL Server und Client

Egal was Ihr einsetzen wollt, sofern Ihr nicht schon MySQL irgendwo installiert habt, müsst ihr es nun tun.

MySQL

 apt-get install -y mariadb-server mariadb-client

MariaDB

 apt-get install -y mysql-server mysql-client

 

Dann wird die Datenbank logger erstellt

mysql -u root -p

> CREATE DATABASE logger;

> quit

Die user.sql anpassen und die Passwörter entsprechend setzen. Diese liegt in /var/www/html/logger/doc

# 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 'SET_PASSWORD';

# used by the web gui for normal viewing, referenced in inc/config_class.php

GRANT SELECT ON logger.* TO logviewer@localhost IDENTIFIED BY 'SET_PASSWORD';

# 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 'SET_PASSWORD';

# activate changes

FLUSH PRIVILEGES;

Das Passwort muss in dieser Datei natürlich anstelle von ‘SET_PASSWORD’ eingetragen werden.

Das SQL ausführen

mysql -u root -p < /var/www/html/logger/doc/user.sql

mysql -u root -p logger < /var/www/html/logger/doc/db.sql

Der zweite Befehl legt die initiale Datenbank an.

Als nächstes muss noch in /var/www/html/logger/inc/config_class.php und adminconfig_class.php das jeweilige Passwort eingetragen werden.

$/var/www/html/logger/inc/config_class.php

class Config extends AbstractConfig {

        function __construct() {

                $this->setDbUser('logviewer');

                $this->setDbPwd('SET_PASSWORD');

                $this->setDbName('logger');

                // Set your preferred language en_US, de_DE, or pt_BR

                $this->setLocale('de_DE');

$ /var/www/html/logger/inc/adminconfig_class.php

class AdminConfig extends AbstractConfig {

        function __construct() {

                $this->setDbUser('loggeradmin');

                $this->setDbPwd('SET_PASSWORD');

                $this->setDbName('logger');

        } // constructor

Wir haben es fast geschafft. 

Syslog NG Server installieren

apt-get install -y syslog-ng libdbd-mysql

Syslog NG rendert alle .conf Dateien in /etc/syslog-ng/conf.d/ .

Wir erstellen für Lggr also eine eigene config die so aussieht:

filter f_no_debug { not level(debug); };

options {

keep_hostname(yes);

};

source s_net {

udp( port(514) log-iw-size(2000) );                                        

};

destination d_newmysql {

sql(

flags(dont-create-tables,explicit-commits)

session-statements("SET NAMES 'utf8'")

flush_lines(10)

flush_timeout(5000)

local_time_zone("Europe/Berlin")

type(mysql)

username("logger")          <= DB user eintragen!

password("SET_PASSWORD")    <= DB password eintragen!

database("logger")          <= DB name eintragen!

host("localhost")

table("newlogs")

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")

indexes()

);

};

log {

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

};

Achtet auf die 3 Stellen wo der User, Passwort und der Datenbankname eingetragen werden muss.

In /etc/default/syslog-ng noch eine Kleinigkeit anpassen

SYSLOGNG_OPTS="-–no-caps"

Nun Syslog NG neustarten

 service syslog-ng restart

Locale prüfen

Es sollte unbedingt noch locale mittels $locale -a geprüft werden. Der Output sollte in etwa so aussehen

locale -a

C

C.UTF-8

de_DE.utf8

POSIX

Falls hier kein de_DE.utf8 steht,  müsst Ihr noch ein dpkg-reconfigure locales durchführen und de_DE.utf8 nachinstallieren. Andernfalls wird das Webinterface nicht richtig funktionieren da die Sprachen vom System abgegriffen werden.

Cronjob einrichten

Auf jeden Fall sollte man noch den Cron installieren um die Datenbank nicht zu zu müllen. Bei uns speichern wir nur die Eintrage der letzten 40 Tage. Sehr empfehlenswert wenn man die Masse der Einträge bedenkt die da zusammenkommen können. Anders gesagt, wer braucht schon uralte Einträge. Meist sind ja doch nur die letzten Stunden / Tage interessant.

Hier der Cron den man mittels crontab -e einfügen kann

0 1 * * * /opt/scripts/lggr_clean

Mit diesem wird lediglich ein Script aufgerufen welches wie folgt aussieht

#!/bin/bash

mysql -u loggeradmin -p"SET_PASSWORD" "logger" << EOF

DELETE FROM Week WHERE date < DATE_SUB(NOW(), INTERVAL 40 DAY);

DELETE FROM newlogs WHERE date < DATE_SUB(NOW(), INTERVAL 40 DAY);

quit

EOF

Client Einrichtung

Auf den meisten Servern sollte dies relativ einfach sein, da rsyslog wohl auf ziemlich jedem System bereits läuft.

Dort muss einfach in /etc/rsyslog.conf folgende Zeile am Anfang eingefügt werden

 *.* @IP-OF-LOGGER-HOST            # UDP auf den default Port 514 

Damit wären die wichtigstens Logs bereits enthalten und Rsyslog ist ja beliebig erweiterbar.

Sollte man den Syslog NG als übermittler nutzen wollen, so kann man dies auf dem Client wie folgt.

 apt-get install syslog-ng 

Anschließend eine Datei Namens 10logger-client.conf erstellen mit diesem Inhalt

destination d_net { udp("IP-OF-LOGGER-HOST" port(514) log_fifo_size(1000)); };

log { source(s_src); destination(d_net); };

In beiden Fällen muss natürlich die IP eures Lggr Servers eingesetzt werden wo der Syslog-ng Server konfiguriert wurde.

Zudem muss natürlich der entsprechende Dienst neugestartet werden.

Also entweder oder 

service syslog-ng restart

service rsyslog restart

 

Somit haben wir den Server installiert und den ersten Client eingerichtet. Infolgedessen könnt Ihr das Webinterface aufrufen und eure ersten Einträge bewundern aber behaltet die Performance im Auge. Je nachdem wie hoch die Anzahl der Einträge ist, benötigt der Apache ein wenig mehr Ram andernfalls könnte die Ladezeit ein wenig hoch gehen. Kurzum habt Ihr anschließend einen Logviewer ohne dabei Java oder sonst etwas zu benötigen.

 

Share it!Share on FacebookEmail this to someoneShare on Google+Tweet about this on Twitter

Schreibe einen Kommentar