Как удалить завершающую новую строку из поля сообщения

Я отправляю файлы журналов Glassfish 4 с помощью Logstash в приемник ElasticSearch. Как я могу удалить с помощью Logstash завершающую новую строку из поля сообщения?

Мое событие выглядит так:

{
  "@timestamp" => "2013-11-21T13:29:33.081Z",
  "message" => "[2013-11-21T13:29:32.577+0000] [glassfish 4.0] [INFO] [] [javax.resourceadapter.mqjmsra.lifecycle] [tid: _ThreadID=142 _ThreadName=Thread-43] [timeMillis: 1385040572577] [levelValue: 800] [[\n  MQJMSRA_RA1101: GlassFish MQ JMS Resource Adapter stopped.]]\n",
  "@version" => "1",
  "tags" => ["multiline", "date_filtered"],
  "host" => "myhost",
  "path" => "../server.log"
} 

person Oliver    schedule 21.11.2013    source источник


Ответы (2)


Вы должны использовать многострочный фильтр с правильным шаблоном, чтобы сообщить logstash, что каждая строка с предшествующим пробелом принадлежит предыдущей строке. Добавьте эти строки в ваш файл conf.

filter{
  ...
  multiline {
    type => "gflogs"
    pattern => "\[\#\|\d{4}"
    negate => true
    what => "previous"
  }
  ...
}

Вы также можете включить плагин grok для обработки временных меток и фильтрации неправильных строк от индексации.

См. полный стек с одним экземпляром logstash на том же компьютере.

input {
  stdin {
    type => "stdin-type"
  }

  file {
    path => "/path/to/glassfish/logs/*.log"
    type => "gflogs"
  }
}

filter{
  multiline {
    type => "gflogs"
    pattern => "\[\#\|\d{4}"
    negate => true
    what => "previous"
  }

  grok {
    type => "gflogs"
    pattern => "(?m)\[\#\|%{TIMESTAMP_ISO8601:timestamp}\|%{LOGLEVEL:loglevel}\|%{DATA:server_version}\|%{JAVACLASS:category}\|%{DATA:kv}\|%{DATA:message}\|\#\]"
    named_captures_only => true
    singles => true
  }

  date {
    type => "gflogs"
    match => [ "timestamp", "ISO8601" ]
  }

  kv {
    type => "gflogs"
    exclude_tags => "_grokparsefailure"
    source => "kv"
    field_split => ";"
    value_split => "="
  }
}

output {
  stdout { codec => rubydebug }
  elasticsearch { embedded => true }
}

Это сработало для меня. Посмотрите также этот пост на logstash-usergroup. Я также могу посоветовать отличную и актуальную книгу по logstash. Это также хороший способ поддержать работу автора logstash.

Надеюсь увидеть вас на любом мероприятии JUG-Berlin!

person AdemC    schedule 03.12.2013

Второе решение — использовать фильтр мутации Logstash. Это позволяет вам удалить значение поля.

filter {
  # Remove leading and trailing whitspaces (including newline etc. etc.)
  mutate {
    strip => "message"
  }
}
person Oliver    schedule 03.12.2013
comment
Не работало при использовании многострочного фильтра. Я использовал gsub для замены \r\n (одного \n было недостаточно) и пробелов с пустой строкой. - person LogicalKip; 19.08.2016