Zentraler Logging und Monitoring Server für das Heimnetz

Wenn man mehrere Geräte in einem Netzwerk betreibt, ist Logging und Monitoring natürlich sehr wichtig. Wir können dies mit einfachen Mitteln und schönem Outcome bewerkstelligen.

Möglich wird es indem wir Rsyslog für Server und Clients verwenden um die Logfiles von allen möglichen Geräten und Anwendungen zentral zu sammeln, Telegraf als Client für die Metrics-Collection sowie für die Syslogs verwenden, eine InfluxDB in welche Telegraf schreiben kann und Grafana welches die Daten aus einer InfluxDB lesen und grafisch aufbereiten kann.

Benötigt:

Pi 3 oder höher – 64Bit minimal Raspbian
ausgehend von einem per SSH angemeldetem Sudo User, entweder führt Ihr diese Anleitung mit sudo su – aus oder ihr schreibt vor jeden Befehl sudo.

Installation eines zentralen Syslog Servers

Zunächst, weil es einfach in jeder Anleitung steckt, das typische Updaten der Repos via apt und das Upgraden der installierten Pakete. Danach wollen wir „rsyslog“ und „rsyslog-relp“ installieren wir wollen nur die notwendigen Ausgaben erhalten und zu Fragen ob wir das wirklich wollen, „Ja“ sagen.

Apt update -qq && apt upgrade -y -qq && apt autoremove -y -qq && apt install rsyslog rsyslog-relp -y -qq

nun können wir Rsyslog konfigurieren:

nano /etc/rsyslog.conf

Kommentare von folgenden Zeilen entfernen:

module(load="imudp")input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")

danach ganz nach unten gehen (strg+v) und die eigene Konfiguration hinzufügen:

##########################
### Eigene Anweisungen ###
##########################
$AllowedSender UDP, 127.0.0.1, LogServer-IP/CIDR (z.B.: 192.168.0.1/24)
# Jeweils ein eigenes Verzeichniss für jeden Host und darin ein Logfile für jeden Dienst anlegen
$template remote-incoming-logs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?remote-incoming-logs

Hier kannst du natürlich auch bereits filtern (z.B.: nur höher notice oder warning), ich empfange aber lieber alles und habe auf den einzelnen Rechnern das logging entsprechend angepasst. Mehr zum Filtern weiter unten.

Das war es eigentlich schon mit der Konfiguration von Rsyslog, also mit Strg * o speichern und mit Strg + x raus aus nano.

Danach noch schnell den Dienst neu starten

systemctl restart rsyslog

Um auch Logs zu empfangen benötigen wir Clients. also am besten auf einem anderen Client (PiHole,  PiVPN, oder auf einem NAS, Router, Switch, you name it) das Remote-Logging aktivieren.

Unter Linux (z.B.: auf deinem PiHole) kannst du die rsyslog.conf aufrufen (wie oben) und dort ganz nach unten scrollen und folgendes einstellen: Alle Logs ab Severity „Notice“ an Logserver senden ausgenommen Mailnachrichten. (Internes Mailsystem des jeweiligen Host schickt z.B.: Warnings/Alerts auch per Mail an Root)

# Logs an zentralen Syslog Server senden
*.notice; mail.none @LogServer-IP:514

# Warteschlange festlegen
$ActionQueueFileName queue
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on
$ActionQueueType LinkedList
$ActionResumeRetryCount -1

Wir legen also fest, dass die die Queue Queue heissen soll und maximal 1g (1GB) Diskspace verwenden darf. Wenn das System heruntergefahren wird, wird es die Queue speichern und die Queue selbst soll nach Schema LinkedList arbeiten, sollte der Syslog Server nicht erreichbar sein, wird es immer wieder versucht, ohne abzubrechen.

Danach die .conf wieder speichern und schließen (strg + o, strg + x) und den Dienst neu starten

systemctl restart rsyslog

Hier und/oder auf dem Server kann man auch filter setzen, was gesendet werden soll – zu viel Information ist unübersichtlich. So könnte man z.B.: nur Warnungen und Höher (Error, Critical Error, Alert) oder einen level darunter notice zum syslog server übertragen. Information auf Info-Level muss schon übersichtlich aufbereitet sein, was bei uns der Fall ist. Dennoch will ich zeigen wie man einen Filter setzt: Will ich z.B.: alles ausser Mail und erst ab Warnung Level senden würde es so ausssehen: #*.warning; mail.none @rsyslog-server-ip:514  Mehr zum setzen von Filtern kannst du auf der Webseite von Rsyslog nachlesen.https://www.rsyslog.com/doc/configuration/filters.html

Dein Syslog Server läuft nun und wird die Logfiles von anderen Rechnern empfangen und in /var/log/ ablegen – jeweils mit einem Verzeichniss für den jeweiligen Host und darin die Logfiles der verschiedenen Dienste.

Wenn du dir das eintreffen der Logfiles direkt ansehen willst, kannst du folgendes eingeben:

tail -f /var/log/syslog

nun wirst du beim eintreffen der Logs direkt mitlesen können (mit Strg + c beenden)

Für ein kleines Heimnetz wäre das schon ausreichend. Aber wir leben in 2024 und es geht natürlich auch ansprechender.

Nachdem nun alle Logs zentral gesammelt werden, würde es natürlich Sinn machen, diese auch so aufzubereiten, dass man die Notwendigen Infos direkt einsehen kann, ohne einzelne Logs zu durchsuchen und mit eventuell ansprechender Grafischer Aufbereitung.

Das kann erreicht werden indem wir mittels „Telegraf“ die Daten von RSyslog an eine InfluxDB weiterreichen. Die InfluxDB kann dann von Grafana als Datenquelle verwendet werden um ein grafisch ansprechendes Dashboard für deinen Syslog Server anzuzeigen.

Hier kann man im oberen Teil Diagramartige Darstellung sehen, so sieht man auf den ersten Blick ob mehr Fehler als sonst passieren.

Im unteren Teil siehst du die Logmessages von verschiedenen Geräten und Anwendungen und weist gleich wo du nachsehen kannst und wonach du suchst.

Ganz oben lassen sich die Daten filtern – vielleicht willst du nur die Daten von „Systemd“ auf einem bestimmten Host sehen, die die Severity „Error“ haben.

Telegraf klinkt sich hierbei in den Spooler von unserem Syslog Server ein und gibt diese Daten an eine InfluxDB weiter. Die InfluxDB kann dann wieder von Grafana als Datenquelle verwendet werden um dir schöne Grafiken zu zaubern.

Influxdb installieren

apt install influxdb

Hier müssen wir eigentlich nichts konfigurieren, ist aber (ähnlich MySQL / MariaDB mittels „mysql“) über den Befehl influx möglich. Auch hier kannst du mittels „show databases“ die Datenbanken anzeigen, Measurements anzeigen usw. für dieses Projekt reicht aber vorerst die Installation selbst.

Telegraf installieren

Öffne einen Browser und schau auf der Webseite https://github.com/influxdata/telegraf/releases nach welche die für dein System richtige Release ist. Für Raspberry Pi 4 wäre es z.B.: armhd Debian

Kopiere dir die Zieladresse und wieder zurück zum Terminal.

nach Eingabe von „wget“ klickst du mit der rechtetn Maustaste in den Terminal um die vorher kopierte Adresse des Telegraf-Pakets herunterzuladen.

Nun wird das Telegraf Paket installiert

sudo dpkg -i telegraf

Danach einmal auf Tab drücken um den Befehl zu komplettieren (um hier Versionsunabhängig zu bleiben)

um Telegraf in den Autostart zu setzen folgendes eingeben:

systemctl enable telegraf
systemctl start telegraf

Sollte der Dient nicht starten, macht es nichts aus, wir müssen die config noch ändern und dafür sorgen, dass Telegraf die Daten von RSyslog erhält.

Hierzu öffnen wir folgendes File:

nano /etc/rsyslog.d/50-telegraf.conf

Dort Tragen wir folgendes ein:

$ActionQueueType LinkedList    # Art des Puffers
$ActionQueueFileName srvrfwd   # Dateiname setzen (startet gleichzeitig den Puffermodus)
$ActionResumeRetryCount 4      # Anzahl Wiederholungen
$ActionQueueSaveOnShutdown on  # Intern puffern wenn Syslog nicht verfügbar #
UDP über Port 6514

# Alles > notice loggen, alles drunter braucht man selten, sonst hier einfach auf "*.*" ändern
*.notice @127.0.0.1:6514;RSYSLOG_SyslogProtocol23Format

Die Config wieder schließen und speichern. Danach rufen wir gleich die nächste Config auf:

nano /etc/telegraf/telegraf.conf

(um das ganze zu vereinfachen – es ist möglich in nano mittels Strg + w zu suchen.)

Suche nach: inputs.syslog

Achte das bei folgenden Zeilen die Kommentare entfernt sind sowie die folgenden Werte eingetragen sind:

[[inputs.syslog]]
server = "tcp://:6514"
keep_alive_period = "5m"
read_timeout = "5s"
best_effort = false
syslog_standard = "RFC5424"

Danach suchen wir nach: outputs.influxdb (Vorsicht, es gibt influxdb_v2 und influxdb – mit nochmals Strg + w gefolgt von Enter kannst du „weitersuchen“.

[[outputs.influxdb]]
urls = ["http://127.0.0.1:8086"]
database = "telegraf"
skip_database_creation = false
timeout = "5s"

Danach die Config wieder speichern und schließen und den Dienst neu starten

systemctl restart telegraf

Grafana über Repository installieren

(siehe : https://grafana.com/docs/grafana/latest/setup-grafana/installation/debian/)

sudo apt-get install -y apt-transport-https software-properties-common wget

sudo mkdir -p /etc/apt/keyrings/wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null

echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

apt update
apt install grafana
sudo systemctl daemon-reload

Grafana Server als Service einrichten

sudo systemctl enable grafana-server.service

Grafana Server starten

sudo systemctl start grafana-server

Grafana sollte nun unte der IP deines Servers auf Port 3000 erreichbar sein.

Bei der ersten Anmeldung verwendest du User: admin und Passwort: admin, danach wirst du aufgefordert, das Admin Passwort zu ändern.

Grafana einrichten

Wir haben uns mit dem Grafana-Admin eingeloggt, also kümmern wir uns zunächst um die Benutzer.

Hierfür gehen wir zu „Users and access“
(Lasse diese Schritte aus, wenn du nur mit deinem Admin arbeiten willst und keinen „normalen“ User benötigst.Du kannst in diesem Fall zu „InfluxDB als Datenquelle hinzufügen“ springen)

Lege einen Benutzer für dich selbst als Useraccount an, mit diesem kannst du dich später anmelden, wenn du Grafana gerade nicht administrierst sondern eben nur den Logmonitor laufen lassen willst.

Ich rate immer dazu, auch eine Gruppe (Team) anzulegen, in diese kommen unser Admin und unser User, das ist die Main-Gruppe, der Admin natürlich auch als Gruppenadmin, der User-Account nur als „Member“.

InfluxDB als Datenquelle hinzufügen

Hierfür zu den Connections wechseln und auf „Add new connection“ klicken

Dann zu den „Data sources“ wechseln

Rechts oben, findest du den Button „Add new Data source“

Dort kannst du nach „Influx“ suchen und solltest eine InfluxDB finden

Folgendes festlgen:

Danach klicke auf „Save + Test“

Du hast nun die InfluxDB als Datenquelle für Grafana hinzugefügt.

Dashboards

Zum Glück muss man das Rad nicht neu erfinden, es gibt bereits viele Dashboards, die genau machen, was wir wollen.

Klicke auf Dashboards

danach findest du oben rechts in der Ecke den Button New:

Wähle Import

In das markierte Feld folgende Nummer eingeben und auf Load klicken: 15644

Wenn du mehr über dieses Dashboard wissen wilslt: https://grafana.com/grafana/dashboards/15644-syslog/

Gratulation du hast deinen Syslog Server erfolgreich aufgesetzt, nun kannst du deine Logs leichter einsehen und so Fehler oder Gefahren schneller erkennen.

Du kannst in Grafana auch Benachrichtigungen für verschiedene Events festlegen, um schnell auf Ereignisse reagieren zu können. Hierbei verweise ich gerne auf PushOver.

System-Metrics an Syslog Server senden und über Grafana auswerten

Lade dir ein weiteres Dashboard für Grafana herunter um die Metrics von deinen Servern in Grafana auszuwerten ich habe mein Setup in diesem Fall auf Raspberry Pi Rechnern laufen, hier bietet sich das Raspberry Pi Monitoring Dashboard an. (https://grafana.com/grafana/dashboards/10578-raspberry-pi-monitoring/)

Sonst kannst du dich hier umsehen: https://grafana.com/grafana/dashboards/?dataSource=influxdb&collector=telegraf um weitere interessante Dashboards für InfluxDB und telegraf zu finden.

In diesem sehe ich nicht nur die Metrics meines vorhandendenen Pi, ich kann auch weitere hinzufügen um auch die wichtigsten Daten zentral einzusehen.

Diese Metrics und vieles mehr kannst du von deinen anderen Servern mit Telegraf einholen. Natürlich gibt es dies auch für Docker Container usw. die Methode kann auf alles mögliche angewendet werden, hierfür einfach in die Telegraf Papers schauen. (https://www.influxdata.com/time-series-platform/telegraf/)

Telegraf wird installiert (Siehe Installation auf Syslog Server) hierbei ist es 1:1 wie bei der Installation auf dem Rsyslog Server da Telegraf hier die selbe Aufgabe ausführt, lediglich der Input ist aus einer anderen Quelle (anstelle von localhost oder Loopback-IP, die IP des Logservers verwenden)

Bei den Inputs kannst du nach inputs.cpu und inputs.net suchen dann solltest du eigentlich alles finden, was du benötigst. Hier einfach entsprechende Konfigurationsteile auskommentieren.

Bei den Outputs, kannst du das selbe einstellen wie bereits auf deinem Syslog Server, jedoch die IP muss eben die, des Syslog Servers sein, dass die Metrics auch auf diesem ankommen, der Rest bleibt gleich.

Telegraf wieder neu starten

systemctl restart telegraf

Nun kannst du neben den Syslogs auch die Metrics für deine anderen Server einholen.

Viel Spaß mit dem Setup!
Die richtige Arbeit fängt aber erst danach so richtig an, die Logs entsprechend anzupassen, dass man nicht zu viel bekommt (um die Nadel im Heuhaufen suchen zu müssen) aber auch nicht zu wenig, dass man nichts wichtiges versäumt.