Skip to main content

Hi All,

Can we parse a log with the below mentioned format with out making any changes while ingesting?

[
  {
    "header": {
      "name": "EcoScope Data",
      "well": "35/12-6S",
      "field": "Fram",
      "date": "2022-06-14",
      "operator": "GeoSoft",
      "startIndex": 2907.79,
      "endIndex": 2907.84,
      "step": 0.01
    },
    "curves": [
      {
        "name": "MD",
        "description": "Measured depth",
        "quantity": "length",
        "unit": "m",
        "valueType": "float",
        "dimensions": 1
      },
      {
        "name": "A40H",
        "description": "Attenuation resistivity 40 inch",
        "quantity": "electrical resistivity",
        "unit": "ohm.m",
        "valueType": "float",
        "dimensions": 1
      }
    ],
    "data": [
      [2907.79, 29.955],
      [2907.80, 28.892],
      [2907.81, 27.868],
      [2907.82, 31.451],
      [2907.83, 28.080],
      [2907.84, 27.733]
    ]
  }
]

 

👋 It would require flattening and extract the JSON log from the event, e.g.,

 

cat json.log | jq -c '.[]'

Otherwise there will be an error when you try to use the JSON input plugin.  Alternatively you could look to use a GROK regex to extract the inner JSON from the JSON array, but flattening and having a single new line delimited record would be recommended. 

An example Parser would then look as follows:

filter { json { source => "message" array_function => "split_columns" } #TODO(add error handling in case of JSON extraction failure mutate { replace => { "event1.idm.read_only_udm.metadata.event_type" => "GENERIC_EVENT" } } #TODO(evalute a more specific UDM event type) mutate { replace => { "header_name.key" => "header_name" "header_name.value.string_value" => "%{header.name}" } } #TODO(add your remainding headers) mutate { merge => { "event1.idm.read_only_udm.additional.fields" => "header_name" } } for idx, curve in curves { mutate { convert => { "idx" => "string" } } mutate { replace => { "_curve_name.key" => "curve_name[%{idx}]" "_curve_name.value.string_value" => "%{curve.name}" } } mutate { merge => { "event1.idm.read_only_udm.additional.fields" => "_curve_name" } } mutate { replace => { "_curve_name" => "" } } } #TODO(extract the remaining curve fields) for idx,each_record in data { mutate { convert => { "idx" => "string" } } for subidx,each_value in each_record { mutate { convert => { "subidx" => "string" "each_value" => "string" } } mutate { replace => { "_data.key" => "data[%{idx},%{subidx}]" "_data.value.string_value" => "%{each_value}" } } mutate { merge => { "event1.idm.read_only_udm.additional.fields" => "_data" } } mutate { replace => { "_data" => "" } } } } mutate { merge => { "@output" => "event1" } } }

And example output:

 

events: < timestamp: < seconds: 1700741914 nanos: 719837698 > idm: < read_only_udm: < metadata: < event_timestamp: < seconds: 1700741914 nanos: 719837698 > event_type: GENERIC_EVENT > additional: < fields: < key: "curve_name[0]" value: < string_value: "MD" > > fields: < key: "curve_name[1]" value: < string_value: "A40H" > > fields: < key: "data[0,0]" value: < string_value: "2907.79" > > fields: < key: "data[0,1]" value: < string_value: "29.955" > > fields: < key: "data[1,0]" value: < string_value: "2907.8" > > fields: < key: "data[1,1]" value: < string_value: "28.892" > > fields: < key: "data[2,0]" value: < string_value: "2907.81" > > fields: < key: "data[2,1]" value: < string_value: "27.868" > > fields: < key: "data[3,0]" value: < string_value: "2907.82" > > fields: < key: "data[3,1]" value: < string_value: "31.451" > > fields: < key: "data[4,0]" value: < string_value: "2907.83" > > fields: < key: "data[4,1]" value: < string_value: "28.08" > > fields: < key: "data[5,0]" value: < string_value: "2907.84" > > fields: < key: "data[5,1]" value: < string_value: "27.733" > > fields: < key: "header_name" value: < string_value: "EcoScope Data" > > > > > >

 


Is there a way we get the parser output in JSON format instead of the above one? and it would be better if the output is like as below

metadata.event_type = "GENERIC_EVENT

security_result.action = "ALLOW"


Is there a way we get the parser output in JSON format instead of the above one? and it would be better if the output is like as below

metadata.event_type = "GENERIC_EVENT

security_result.action = "ALLOW"


You can pretend to make a parser in the GUI IDE and click "preview" to see the UDM output.