Wie kann ich eine von Menschen lesbare Byte-Anzahl in Logstash analysieren?


1

Ich habe es mit Protokolldateien zu tun, die Teile enthalten wie:

538,486K of 1,048,576K

Diese stellen die Speichernutzung (Java-Heapspeicher) dar, die in einem für Menschen lesbaren Format gerendert wird. Ich möchte diese Zahlen in Diagrammen in Kibana verfolgen. Zu diesem Zweck würde ich gerne Logstashs Grok-Filter verwenden, um diese Zahlen zu analysieren, aber ich weiß nicht, wie ich mit dem Tausendertrennzeichen umgehen soll (dh es ignorieren soll).

Idealerweise hätte ich etwas, das auch mit dem "K" umgehen und mit tausend multiplizieren kann. Zum jetzigen Zeitpunkt ist mir nicht bekannt, dass sich ein System in einer anderen Einheit als Kilobyte anmeldet, aber ich würde es vorziehen, diese Annahme nicht zu machen.


Was ist mit dem Versuch, das Protokollformat Ihrer App "maschinenlesbarer" zu machen? Das wäre zuverlässiger als ein Regex.

@ AndréDaniel: Ich versuche, die Produktionsentwickler dazu zu bringen, Protokolle eher wie Daten zu behandeln, aber es liegt nicht an mir, den Code selbst zu ändern. Und es würde viele Monate dauern, bis eine Änderung bei allen Kunden eingeführt wird.
Peter Becker

Antworten:


1

Der mutateFilter ermöglicht das Ersetzen von Text mit der gsubOption.

gsub Es wird ein Array verwendet, in dem jedes Triplett von Werten Folgendes angibt:

  • Zielfeldname
  • Suchmuster
  • Muster ersetzen

Es unterstützt technisch reguläre Ausdrücke, aber das brauchen wir in diesem Fall nicht.

Zuerst streifen wir die Kommas ab. Einfach genug.

Zweitens multiplizieren wir. Soll Kmit 1000 multipliziert werden? Wenn ja, so scheint es mir , dass wir einfach ersetzen Kmit 000.

Diese zusammenfassen:

filter {
    mutate {
        gsub {[
            "some_field", ",", "",
            "some_field", "K", "000"
        ]}
    }
}

Sie können bei Bedarf weitere Ersatzoptionen hinzufügen.

Je nach Ihren Umständen kann es Ksein, dass Sie mit 1024 multiplizieren, was etwas komplizierter sein wird. Ich sehe keine sofort einsatzbereite Lösung, aber Sie können den rubyFilter verwenden, um einige Berechnungen durchzuführen .


Ich bin den Rubinpfad entlang gelandet, aber ich denke, Ihre Antwort ist richtig. Ich werde meine als Alternative posten.
Peter Becker

1

Ich denke, Rutters Antwort sollte in meinem Fall funktionieren. Folgendes habe ich getan, bevor ich es gelesen habe:

filter {
  grep {
    match => { "message" => "...something identifying the message..." }
    drop => false
    add_tag => [ "MyMarker" ] 
  }
  if "MyMarker" in [tags] {
    grok {
      match => [ "message", "...(?<rawCurValue>[0-9,]+)K of (?<rawMaxValue>[0-9,]+)K..." ]
      break_on_match => false
    }
    if "_grokparsefailure" not in [tags] {
      ruby {
        code => "
           if(event['rawCurValue'])
             event['curValue'] = Integer(event['rawCurValue'].gsub(',','')) * 1000
           end
           if(event['rawMaxValue'])
             event['maxValue'] = Integer(event['rawMaxValue'].gsub(',','')) * 1000
           end
        "
      }
    }
  }
}

Ich vermute, es könnte prägnanter sein, aber es scheint zu funktionieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.