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.