2013-12-05 2 views
1

Я привязываюсь к использованию logstash для выполнения преобразования данных json, которые записываются в текстовый файл.Фильтр мутанта Logstash на json-данных

Logstash конфигурационный фрагмент:

filter { 
    mutate { 
    gsub => [ 
     # replace all '::~~' with '\r\n' 
     "alert.explanation.cnc-services.cnc-service.channel", "\:\:~~", "\\r\\n" 
#  "channel", "~~", "n" 
    ] 
    } 
} 

вход JSON:

{ 
    "alert": { 
    "explanation": { 
     "cnc-services": { 
     `enter code here`"cnc-service": { 
      "channel": "TEXT1 TEXT2::~~TEXT3::~~TEXT4::~~TEXT5::~~TEXT6::~~::~~" 
     } 
     } 
    } 
    } 
} 

Желаемый выход:

{ 
    "alert": { 
    "explanation": { 
     "cnc-services": { 
     "cnc-service": { 
      "channel": "TEXT1 TEXT2\r\nTEXT3\r\nTEXT4\r\nTEXT5\r\nTEXT6\r\n\r\n" 
     } 
     } 
    } 
    } 
} 

Входные данные только часть всего JSon документа, есть могут другие поля, но мне нужно только изменить это. Эти данные генерируются другим приложением и не могут быть изменены. Ни одна из статей, которые я видел для logstash, не говорит о том, чтобы делать что-то подобное.

редактировать: Вот секция входа logstash конфигурации

input { 
    # Read from log file 
    file { 
     codec => "json" 
     type => "fireeye" 
     path => ["/var/log/app/events.json"] 
    } 
} 
+0

Педантичный, но важный вопрос: как Logstash получает эти данные, анализируется ли он в полях и подполях событий, или это строка JSON в одном плоском поле? – rutter

+0

Я считаю, что он разбирает его как json. Вот входной секции: вход { # Чтение из файла журнала файл { кодек => "JSON" тип => "fireeye" путь => [ "/var/log/app/events.json"] } } –

+0

Хм. К сожалению, документацию на кодеки довольно сложно найти. Мне посчастливилось читать строки за строкой с вводом файла, затем разбор одного поля в подполях с помощью [json filter plugin] (http://logstash.net/docs/1.2.2/filters/JSON). Я бы посоветовал запросить список [logstash-users] (https://groups.google.com/d/forum/logstash-users), если вы не можете найти помощь здесь. – rutter

ответ

1

Некоторых пробы и ошибки показали, что ключ в массиве GSUB должен иметь формат.

first_level[second_level][third_level]... 

Так что в вашем случае:

filter { 
    mutate { 
    gsub => ["alert[explanation][cnc-services][cnc-service][channel]", "whatever"] 
    } 
} 

Я не знаю точно, что логика, но это работает.

Смежные вопросы