Einfacher Unix/Linux-Logparser (seit, bis)

Einfacher Unix/Linux-Logparser (seit, bis)

Hat irgendjemand schon einmal einen einfachen Unix-/Linux-Protokollparser verwendet/erstellt, der Protokolle wie die folgenden analysieren kann:

timestamp log_message \n

Sortieren Sie die Nachrichten, analysieren Sie den Zeitstempel und geben Sie zurück:

  • Alle Nachrichten
  • Nachrichten nach einem bestimmten Datum (--since)
  • Nachrichten vor einem bestimmten Datum (--until)
  • Kombination aus --since, --until

Ich könnte so etwas schreiben, bin mir aber nicht sicher, ob es dafür etwas Fertiges gibt. Es würde gut in die automatisierten Berichte passen, die ich erstellen möchte.

Antwort1

Schauen Sie sich andieses Python-Programm, das ich geschrieben habeum zu sehen, ob es Ihren Vorstellungen nahe kommt oder an Ihre Bedürfnisse angepasst werden kann.

Antwort2

Selbst wenn Sie einen finden, weiß ich nicht, ob ich ihm vertrauen würde. Da der Zeitstempel beispielsweise nicht im Voraus bekannt ist, könnte er zwischen TT-MM-JJJJ und MM-TT-JJJJ nur unterscheiden, indem er so lange vorliest, bis entweder xx oder zz mit xx-zz-JJJJ größer als 12 ist. Ich bin sicher, dass es noch andere Probleme gibt.

Ich denke, es wäre viel einfacher und zuverlässiger, Ihr eigenes Format zu schreiben, da Sie die Standard-String-to-Datetime-Bibliothek Ihrer Sprache verwenden und die Datumsformatbezeichner explizit angeben können.

Zum Beispiel mit Python:

    import re
    from datetime import datetime
    line_regex = re.compile(
        r'''
        \[
        (?P<day> \d{1,2} )
        /
        (?P<month> \w{3} )
        / 
        (?P<year> \d{4} )
        :
        (?P<hour> \d{2} )
        : 
        (?P<minute> \d{2} )
        : 
        (?P<second> \d{2} )
        \s
        (?P<timezone> -?\d{4} )
        \]
        ''', re.VERBOSE)


   new_entry['time'] = datetime.strptime(
        parsed_line['day'] +
        parsed_line['month'] +
        parsed_line['year'] +
        parsed_line['hour'] +
        parsed_line['minute'] +
        parsed_line['second']
        , "%d%b%Y%H%M%S"
   )

Wenn Sie ein Modul/eine Bibliothek möchten, die versucht, das vorhandene Format herauszufinden, ist eine Option für PerlDatum::Parse.

Antwort3

Die einzige halbwegs anständige Lösung, die ich dafür gefunden habe, warsyslog-ngProtokollierung in einer Datenbank (an diesem Punkt wird es auf einfache SQL-Abfragen reduziert) – Vorausgesetzt, Sie protokollieren alles zentral, verursacht dies keinen allzu großen zusätzlichen Aufwand.

(Fügen Sie hier offensichtliche Vorteile und offensichtliche Vorbehalte ein)

verwandte Informationen