Próbuję przeanalizować wiadomość dziennika do formatu JSON.

Mam następną wiadomość JSON jako wejście w logstash:

    {
    ...
    field 1: xxx,
    message: "----------- SCAN SUMMARY -----------\nKnown viruses: 8520944\nEngine version: 0.102.4\nScanned directories: 408\nScanned files: 1688\nInfected files: 0\nTotal errors: 50\nData scanned: 8.93 MB\nData read: 4.42 MB (ratio 2.02:1)\nTime: 22.052 sec (0 m 22 s)\n",
    fieldX: ...
    }

Chciałbym przekonwertować pole komunikatu do JSON sformatowany jako:

message: 
{
known_viruses: 8520944,
engine_version: 0.102.4
scanned_directories: 408,
...
}

Próbowałem zrobić to w różnych krokach, najpierw przedzielenie linii przez "n", ale nie działa:

 dissect {
   mapping => {
   "message" => "%{removeField}\n%{viruses}\n%{engine_version}"
   }
 }

Próbowałem też zmutować, ale nie dzielą się):

mutate {
    split => ["message", "\n"]
  }
  

A także z rubinem (tym samym):

ruby {
  event["message"] = event["message"].split("\n")
}

Każdy pomysł, jak konwertować ciąg komunikatów do poprawnego formatu JSON?

0
Asier Gomez 20 kwiecień 2021, 17:57

1 odpowiedź

Najlepsza odpowiedź

Jeśli format jest zawsze w tej samej kolejności, możesz przyjrzeć się przy użyciu wtyczki filtra GROK: https://www.elastic.co/guide/ en / loggsty / prąd / wtyczki-filtry-grok.html

Wzór, jaki myślę, że może wykonać sztuczkę, jeśli chcesz użyć wartości liczbowej w ciągu kilku sekund, możesz trochę zmienić wzór, a także dla rozmiaru pliku ...:

----------- SCAN SUMMARY -----------\nKnown viruses: %{NUMBER:known_viruses}\nEngine version: %{DATA:engine_version}\nScanned directories: %{NUMBER:scanned_directories}\nScanned files: %{NUMBER:scanned_files}\nInfected files: %{NUMBER:infected_files}\nTotal errors: %{NUMBER:total_errors}\nData scanned: %{DATA:data_scanned}\nData read: %{DATA:data_read}\nTime: %{DATA:time}\n
0
YouryDW 21 kwiecień 2021, 09:52