У меня есть файл, содержащий объекты json, разделенные линией, а также данные не json (stderr stacktraces).отправлять последовательные недопустимые строки json между действительными линиями json в одном сообщении filebeat
{"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"}
Используя следующий конфиг, я в состоянии получить действительные линии JSon правильно, но инвалид JSON посылается individualy (построчно).
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
выход:
{
"@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"
}
Я хочу клуб всех не JSon линии, пока новый JSon линии в одно сообщение.
Используя многострочный, я попытался следующий
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
Но не кажется, что это будет работать. Выполнение многострочных правил по значениям event
ключа, которое было указано в json.message_key
.
Из docs here я понимаю, почему это происходит json.message_key
-
JSON ключ, на котором, чтобы применить фильтрацию линий и многострочных параметров. Этот ключ должен быть верхнего уровня, и его значение должно быть строковым, в противном случае оно игнорируется. Если текстовый ключ не определен, нельзя использовать фильтрацию линий и многострочных функций.
Есть ли какой-либо другой способ объединения последовательных строк un json в одно сообщение?
Я хочу, чтобы вся трассировка стека была захвачена до того, как она отправит ее в logstash.