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.