Mikrotik Scripting - Router-Log schnell nach Zeit filtern
Oft braucht man nur eine eingeschränkte Anzahl an Log-Events zwischen zwei Datumswerten oder innerhalb einer bestimmen Zeit wie bspw. der letzten Stunde. Es gibt hierzu bereits einige Lösungen, aber viele davon sind eher lang und nutzen zusätzliche Variablen und Schleifen. Das war auch hauptsächlich der Grund warum ich mir eine kürzere Variante dafür überlegt habe.
Mit folgendem Trick lassen sich die Filterfunktionen von print where und find dazu benutzen um Einträge nach Datum zu selektieren. Der eigentliche Trick hierbei ist das man die Eigenschaften/Spalten des Logs als Variable in der Filter-Beschreibung nutzen kann, jedoch dürfen diese nicht wie sonst normale Variablen mit vorangestelltem Dollarzeichen ausgezeichnet werden sondern mit ihrem Namen und geklammert: "
Als Zeitbereich könnt ihr entweder die Kurzversionen mit Einheits-Suffix benutzen wie d(Tage),h(Stunden), m(Minuten), s(Sekunden), oder als Timecode angeben: 00:15:00 (hh:mm:ss). Wer es noch effizienter haben will, speichert sich die Berechnung des aktuellen Timestamps vorher in einer Variablen, dann muss diese Berechnung vom Interpreter nicht für jede Logzeile wiederholt werden.
Wie immer lässt sich das ganze auch mit zusätzlichen Spalten bei der Suche kombinieren
Wichtiger Hinweis: Die oben aufgeführte Methode funktioniert erst ab RouterOS Version 7.17 zuverlässig. Der Grund ist, dass davor die Zeit-Spalte mit inkonsistenten Formaten geführt wurde, also Events des aktuellen Tages nicht ISO-Konform aufgeführt waren. Deshalb musste man dort mit zusätzlichen If-Checks arbeiten. Da in den aktuellen Releases die Zeit nun durchgängig ISO-Konform im Log aufgeführt wird, sind diese Workarounds jetzt nicht mehr nötig.
Gruß @colinardo
Mit folgendem Trick lassen sich die Filterfunktionen von print where und find dazu benutzen um Einträge nach Datum zu selektieren. Der eigentliche Trick hierbei ist das man die Eigenschaften/Spalten des Logs als Variable in der Filter-Beschreibung nutzen kann, jedoch dürfen diese nicht wie sonst normale Variablen mit vorangestelltem Dollarzeichen ausgezeichnet werden sondern mit ihrem Namen und geklammert: "
(Eigenschaft)
". Diese Methode ist so gut wie nirgendwo vernünftig dokumentiert, deswegen auch noch nicht weit verbreitet, aber wie man sehen kann, sehr nützlich, auch da man sie in anderen Befehlen die das Filtern mittels "print" und "find" zulassen anwenden kann. Es folgen ein paar Beispiele.
Beispiel: Zeige nur die Events innerhalb der letzten Stunde (berücksichtigt die Zeitzone des Routers):
/log print where (([:timestamp]+([/system clock get gmt-offset]."s"))-[:totime (time)]) < 1h
Als Zeitbereich könnt ihr entweder die Kurzversionen mit Einheits-Suffix benutzen wie d(Tage),h(Stunden), m(Minuten), s(Sekunden), oder als Timecode angeben: 00:15:00 (hh:mm:ss). Wer es noch effizienter haben will, speichert sich die Berechnung des aktuellen Timestamps vorher in einer Variablen, dann muss diese Berechnung vom Interpreter nicht für jede Logzeile wiederholt werden.
Beispiel: Zeige die Events zwischen zwei bestimmen Datumswerten:
/log print where [:totime (time)] > [:totime "2025-02-27 00:00:00"] && [:totime (time)] < [:totime "2025-02-28 00:00:00"]
Beispiel: Speichere die Events innerhalb der letzten Stunde in einer Variablen
# Assoziatives Array mit print Befehl und "as-value" ausgeben
:global MYLOG [/log print as-value where (([:timestamp]+([/system clock get gmt-offset]."s"))-[:totime (time)]) < 1h]
# gleiches Prinzip funktioniert auch mit dem "find" Befehl
:global MYLOG [/log find (([:timestamp]+([/system clock get gmt-offset]."s"))-[:totime (time)]) < 1h]
Wie immer lässt sich das ganze auch mit zusätzlichen Spalten bei der Suche kombinieren
Beispiel: Zeige die Events zwischen zwei Datumswerten und zusätzlich mit dem String "logged in" im Body des Events
/log print where [:totime (time)] > [:totime "2025-02-27 00:00:00"] && [:totime (time)] < [:totime "2025-02-28 00:00:00"] && message ~ "logged in"
Wichtiger Hinweis: Die oben aufgeführte Methode funktioniert erst ab RouterOS Version 7.17 zuverlässig. Der Grund ist, dass davor die Zeit-Spalte mit inkonsistenten Formaten geführt wurde, also Events des aktuellen Tages nicht ISO-Konform aufgeführt waren. Deshalb musste man dort mit zusätzlichen If-Checks arbeiten. Da in den aktuellen Releases die Zeit nun durchgängig ISO-Konform im Log aufgeführt wird, sind diese Workarounds jetzt nicht mehr nötig.
Gruß @colinardo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 671663
Url: https://administrator.de/tutorial/mikrotik-scripting-router-log-schnell-nach-zeit-filtern-671663.html
Ausgedruckt am: 27.02.2025 um 19:02 Uhr