Одной из основных проблем является то, что данные тоже похожи, но не совсем JSON. Splunk будет обрабатывать JSON очень хорошо, либо во время индексации, либо с помощью такой команды, как spath
.
. Учитывая, что ваши примеры данных не JSON, нам нужно вернуться к регулярным выражениям .
Это довольно простое c регулярное выражение, которое извлекает все от начального {
до двойного }}
, которое соответствует вашим данным. (?m)
и max_match=0
говорят Splunk совпадать столько раз, сколько возможно.
| rex max_match=0 field=raw "(?m)(?<r>{.*}})"
Теперь, когда Splunk сопоставил каждую запись в событии, мы можем разделить их на отдельные события и удалить полное событие .
| mvexpand r | fields - raw
Затем выполните рекс над каждой записью, извлекая только status_msg
| rex field=r "'Status': '(?<status_msg>[^']+)'"
Наконец, отбросьте события / строки, в которых status_msg
содержит Success
* 1021. *
| where NOT status_msg LIKE "%Success%"
Вот пример регулярных выражений, работающих над вашими данными.
| makeresults | eval raw="{[{'Region': 'us-east-1', 'IPAddress': '01.000.2.12', 'StatusReport': {'Status': 'Success: DNS resolution Success: Rcode Domain(3)', 'CheckedTime': datetime.datetime(2017, 2, 1, 14, 47, 35, 371000, tzinfo=tzlocal())}},
{'Region': 'us-west-1', 'IPAddress': '01.000.14.10', 'StatusReport': {'Status': 'Failure: DNS resolution failed: Rcode Domain(3)', 'CheckedTime': datetime.datetime(2017, 2, 1, 14, 47, 34, 715000, tzinfo=tzlocal())}},
{'Region': 'us-west-2', 'IPAddress': '01.000.22.10', 'StatusReport': {'Status': 'Failure: DNS resolution failed: Rcode Domain(3)', 'CheckedTime': datetime.datetime(2017, 2, 1, 14, 47, 42, 801000, tzinfo=tzlocal())}},
{'Region': 'us-west-2', 'IPAddress': '01.000.18.10', 'StatusReport': {'Status': 'Failure: DNS resolution failed: Rcode Domain(3)', 'CheckedTime': datetime.datetime(2017, 2, 1, 14, 47, 25, 189000, tzinfo=tzlocal())}},
{'Region': 'us-east-1', 'IPAddress': '01.000.1.10', 'StatusReport': {'Status': 'Failure: DNS resolution failed: Rcode Domain(3)', 'CheckedTime': datetime.datetime(2017, 2, 1, 14, 47, 42, 293000, tzinfo=tzlocal())}}]}"
| rex max_match=9999 field=raw "(?m)(?<r>{.*}})"
| mvexpand r | fields - raw
| rex field=r "'Status': '(?<status_msg>[^']+)'"
| where NOT status_msg LIKE "%Success%"