Mikrotik Scripting - Router-Log schnell nach Zeit filtern
Inhaltsverzeichnis
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: "
(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. Man kann sie auch in anderen Befehlen welche das Filtern mittels "print" und "find" zulassen, anwenden. Es folgen ein paar Beispiele./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.
/log print where [:totime (time)] >= [:totime [/system clock get date]]
/log print where [:totime (time)] > [:totime "2025-02-27 00:00:00"] && [:totime (time)] < [:totime "2025-02-28 00:00:00"]
# 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
/log print where [:totime (time)] > [:totime "2025-02-27 00:00:00"] && [:totime (time)] < [:totime "2025-02-28 00:00:00"] && message ~ "logged in"
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: 05.07.2025 um 17:07 Uhr
Serie: Mikrotik Scripting
Mikrotik Scripting - Router-Log schnell nach Zeit filternMikrotik Scripting - Quickly filter Router-Log by datetime (englisch)Mikrotik Scripting - Parameter "place-before" nutzen um FW-Regeln "nach" anderen anzulegenMikrotik Scripting: Using the "place-before" parameter to place fw rule "after" other rule (englisch)Mikrotik Scripting: Resolve Domain to IPv6 Address (englisch)1Mikrotik Scripting: Domain zu IPv6 Adresse(n) auflösen1