2014-09-14 3 views
4

У меня есть файл фиксированной позиции (столбца), где нет разделителя, который разделяет поля. Каждое поле имеет свою начальную позицию и длину. Вот пример данных:Помощник фильтра архива Logstash - файл с фиксированной позицией

520140914191193386---------7661705508623855646---1595852965---133437--the lazy fox jumping over-----------------------212.75.12.85--- 

В то время как я использовал дефис (-), чтобы показать образец приведенных выше данных, фактический файл содержит пробелы, если фактическое поле короче, чем допускается в схеме.

Схема в этом случае:

UsedID (start position 1, length 27) 
SystemID (start position 28, length 22) 
SampleID (start position 50, length 13) 
LineID (start position 63, length 8) 
Text (start position 71, length 48) 
IP (start position119, length 15) 

В идеале, я хотел бы получить следующие значения полей в logstash (без конечных пробелов)

UsedID:520140914191193386 
SystemID:7661705508623855646 
SampleID:1595852965 
LineID:133437 
Text:the lazy fox jumping over 
IP:212.75.12.85 

Как разобрать этот тип файла с обращал внимание?

ответ

7

Я бы на два шага процесс:

  • Сплит данные в поля
  • Газ пустых данные от конца каждого поля

Поскольку каждое поле имеет известную длину, вы можете использовать шаблон регулярного выражения, например .{27}, чтобы соответствовать им.

В Grok можно назвать поле, как так: (?<user_id>.{27})

Вы можете проверить полную картину в grok debugger, но что-то подобное должно достичь длины на основе раскола:

(?<user_id>.{27})(?<system_id>.{22})(?<sample_id>.{13})(?<line_id>.{8})(?<text>.{48})(?<ip>.{15}) 

Вы что ваши лишние символы - все пробелы, поэтому вы можете очистить их, используя mutate filter с strip option.

Все вместе, это может выглядеть примерно так:

filter { 
    grok { 
     match => ["message", "(?<user_id>.{27})(?<system_id>.{22})(?<sample_id>.{13})(?<line_id>.{8})(?<text>.{48})(?<ip>.{15})"] 
    } 

    mutate { 
     strip => [ 
      "user_id", 
      "system_id", 
      "sample_id", 
      "line_id", 
      "text", 
      "ip" 
     ] 
    } 
}