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.
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
Code-Sprache: JavaScript (javascript)
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
[code]apt-get install php php-mysql[/code]
Nun noch in /etc/php/7.0/apache2/php.ini und in /etc/php/7.0/cli/php.ini eure Zeitzone setzen.
[code]date.timezone = Europe/Berlin[/code]
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
[code]apt-get install php-redis redis-server[/code]
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
[code]// $this->cache = new LggrCacheRedis();
$this->cache = LggrCacheFile[/code]
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.
[code]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[/code]
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
[code] htpasswd -c /var/www/webuser logger [/code]
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
[code]$ /etc/apache2/sites-available/000-default.conf
<VirtualHost>
—SNIP—
<Directory /var/www/html/>
AllowOverride All
</Directory>
</VirtualHost>
[/code]
Nun noch die Rechte setzen
[code]chown www-data:www-data /var/www/html/logger/cache/[/code]
In der inc/config_class.php muss auf den contrib Ordner verwiesen werden. In Variante 2 müssen hier die Pfade angepasst werden
[code]
/* 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/‘);
[/code]
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
[code] apt-get install -y mariadb-server mariadb-client[/code]
MariaDB
[code] apt-get install -y mysql-server mysql-client[/code]
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:
[code]
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.