2017-01-04 11 views
0

Ich habe eine Datei, die Zeilen getrennte JSON-Objekte sowie Nicht-JSON-Daten (stderr Stacktraces) enthält.senden konsekutiv ungültige JSON-Zeilen zwischen gültigen JSON-Zeilen in einer einzigen Dateibeat-Nachricht

{"timestamp": "20170104T17:10:39", "retry": 0, "level": "info", "event": "failed to download"} 
{"timestamp": "20170104T17:10:40", "retry": 1, "level": "info", "event": "failed to download"} 
{"timestamp": "20170104T17:10:41", "retry": 2, "level": "info", "event": "failed to download"} 
Traceback (most recent call last): 
    File "a.py", line 12, in <module> 
    foo() 
    File "a.py", line 10, in foo 
    bar() 
    File "a.py", line 4, in bar 
    raise Exception("This was unexpected") 
Exception: This was unexpected 
{"timestamp": "20170104T17:10:42", "retry": 3, "level": "info", "event": "failed to download"} 
{"timestamp": "20170104T17:10:43", "retry": 4, "level": "info", "event": "failed to download"} 

die folgende Konfiguration verwenden, ich bin in der Lage die gültigen json Linien richtig zu erhalten, aber die ungültige json wird individualy (Zeile für Zeile) gesendet.

filebeat.yml

filebeat.prospectors: 
    - input_type: log 
    document_type: mytype 
    json: 
     message_key: event 
     add_error_key: true 
    paths: 
     - /tmp/*.log 

output: 
    console: 
    pretty: true 

    file: 
    path: "/tmp/filebeat" 
    filename: filebeat 

Ausgang:

{ 
    "@timestamp": "2017-01-04T12:03:36.659Z", 
    "beat": { 
    "hostname": "...", "name": "...", "version": "5.1.1" 
    }, 
    "input_type": "log", 
    "json": { 
    "event": "failed to download", 
    "level": "info", 
    "retry": 2, 
    "timestamp": "20170104T17:10:41" 
    }, 
    "offset": 285, 
    "source": "/tmp/test.log", 
    "type": "mytype" 
} 
{ 
    "@timestamp": "2017-01-04T12:03:36.659Z", 
    "beat": { 
    "hostname": "...", "name": "...", "version": "5.1.1" 
    }, 
    "input_type": "log", 
    "json": { 
    "event": "Traceback (most recent call last):", 
    "json_error": "Error decoding JSON: invalid character 'T' looking for beginning of value" 
    }, 
    "offset": 320, 
    "source": "/tmp/test.log", 
    "type": "mytype" 
} 

ich Club wollen alle nicht json Linien, bis eine neue json Linie in einer Nachricht.

mehrzeilige Verwendung habe ich versucht, die folgende

filebeat.prospectors: 
    - input_type: log 
    document_type: mytype 
    json: 
     message_key: event 
     add_error_key: true 
    paths: 
     - /tmp/*.log 
    multiline: 
     pattern: '^{' 
     negate: true 
     match: after 

output: 
    console: 
    pretty: true 

    file: 
    path: "/tmp/filebeat" 
    filename: filebeat 

Aber es scheint nicht zu funktionieren. Es führt die Multiline-Regeln für die Werte event Schlüssel, der in json.message_key angegeben wurde.

Vom docs here Ich verstehe, warum das json.message_key geschieht -

JSON Taste, auf der die Linie Filterung und mehrzeilige Einstellungen anzuwenden. Dieser Schlüssel muss die oberste Ebene sein und sein Wert muss eine Zeichenfolge sein, andernfalls wird ignoriert. Wenn kein Textschlüssel definiert ist, können die Zeilenfilter und die mehrzeiligen Funktionen nicht verwendet werden.

Gibt es eine andere Möglichkeit, konsekutive Non-Json-Zeilen in eine einzelne Nachricht zu vereinigen?

Ich möchte die gesamte Stack-Trace erfasst werden, bevor es an Logstash sendet.

Antwort

1

Filebeat gilt das mehrzeilige nach die JSON Gruppierung so das mehrzeilige Muster Parsen kann nicht auf die Zeichen basieren, die das Objekt bilden JSON (z.B. {).

In Filebeat gibt es eine andere Möglichkeit, JSON-Parsing durchzuführen, so dass das JSON-Parsing nach der mehrzeiligen Gruppierung erfolgt, sodass Ihr Muster die JSON-Objektzeichen enthalten kann. Sie benötigen FileBeat 5.2 (wird bald veröffentlicht), da das target-Feld zum decode_json_fields-Prozessor hinzugefügt wurde, sodass Sie angeben können, wo die decodierten JSON-Felder zum Ereignis hinzugefügt werden.

filebeat.prospectors: 
- paths: [input.txt] 
    multiline: 
    pattern: '^({|Traceback)' 
    negate: true 
    match: after 

processors: 
- decode_json_fields: 
    when.regexp: 
     message: '^{' 
    fields: message 
    target: 
- drop_fields: 
    when.regexp: 
     message: '^{' 
    fields: message 

Getestet habe ich die mehrzeilige Muster here den Golang Spielplatz verwenden.

Filebeat erzeugt die folgende Ausgabe (unter Verwendung der Protokollzeilen, die Sie oben als Eingabe angegeben haben). (Ich habe einen Build vom Masterzweig verwendet.)

{"@timestamp":"2017-01-05T20:34:18.862Z","beat":{"hostname":"host.example.com","name":"host.example.com","version":"5.2.0-SNAPSHOT"},"event":"failed to download","input_type":"log","level":"info","offset":95,"retry":0,"source":"input.txt","timestamp":"20170104T17:10:39","type":"log"} 
{"@timestamp":"2017-01-05T20:34:18.862Z","beat":{"hostname":"host.example.com","name":"host.example.com","version":"5.2.0-SNAPSHOT"},"event":"failed to download","input_type":"log","level":"info","offset":190,"retry":1,"source":"input.txt","timestamp":"20170104T17:10:40","type":"log"} 
{"@timestamp":"2017-01-05T20:34:18.862Z","beat":{"hostname":"host.example.com","name":"host.example.com","version":"5.2.0-SNAPSHOT"},"event":"failed to download","input_type":"log","level":"info","offset":285,"retry":2,"source":"input.txt","timestamp":"20170104T17:10:41","type":"log"} 
{"@timestamp":"2017-01-05T20:34:18.862Z","beat":{"hostname":"host.example.com","name":"host.example.com","version":"5.2.0-SNAPSHOT"},"input_type":"log","message":"Traceback (most recent call last):\n File \"a.py\", line 12, in \u003cmodule\u003e\n foo()\n File \"a.py\", line 10, in foo\n bar()\n File \"a.py\", line 4, in bar\n raise Exception(\"This was unexpected\")\nException: This was unexpected","offset":511,"source":"input.txt","type":"log"} 
{"@timestamp":"2017-01-05T20:34:18.862Z","beat":{"hostname":"host.example.com","name":"host.example.com","version":"5.2.0-SNAPSHOT"},"event":"failed to download","input_type":"log","level":"info","offset":606,"retry":3,"source":"input.txt","timestamp":"20170104T17:10:42","type":"log"} 
{"@timestamp":"2017-01-05T20:34:18.862Z","beat":{"hostname":"host.example.com","name":"host.example.com","version":"5.2.0-SNAPSHOT"},"event":"failed to download","input_type":"log","level":"info","offset":702,"retry":4,"source":"input.txt","timestamp":"20170104T17:10:43","type":"log"} 
Verwandte Themen