Logstasher + Kibana: сообщение в двойных кавычках и его трудно разобрать

Я использую этот стек:

  • On each front server
    • rails
    • gem logstasher (форматирует лог в json)
    • logstash-forwarder (просто перенаправляет журналы в logstash на центральном сервере)
  • On log server:
    • logstash (to centralize and index logs)
    • кибана для отображения

Kibana хорошо работает с форматом JSON. Но данные «сообщения» предоставляются строкой, а не в виде json (см. Предоставленный фрагмент). Есть ли способ исправить это? Например, получить доступ к статусу немного сложно.

Вот образец сообщения

{
  _index: logstash-2014.09.18
  _type: rails
  _id: RHJgU2L_SoOKS79pBzU_mA
  _version: 1
  _score: null
  _source: {
  message: "{"@source":"unknown","@tags":["request"],"@fields":{"method":"GET","path":"/foo/bar","format":"html","controller":"items","action":"show","status":200,"duration":377.52,"view":355.67,"db":7.47,"ip":"123.456.789.123","route":"items#show","request_id":"021ad750600ab99758062de60102da8f"},"@timestamp":"2014-09-18T09:07:31.822782+00:00"}"
  @version: 1
  @timestamp: 2014-09-18T09:08:21.990Z
  type: rails
  file: /home/user/path/logstash_production.log
  host: webserver.example.com
  offset: 23200721
  format: json_event
  }
  sort: [
    rails
  ]
}

Спасибо за помощь ;).

РЕДАКТИРОВАТЬ 1. Добавьте файлы конфигурации logstash:

/etc/logstash/conf.d/01-lumberjack-input.conf

input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
    codec => "json"
  }
}

/etc/logstash/conf.d/10-syslog.conf

filter {
 if [type] == "syslog" {
   grok {
     match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
     add_field => [ "received_at", "%{@timestamp}" ]
     add_field => [ "received_from", "%{host}" ]
   }
   syslog_pri { }
   date {
     match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
   }
 }
}

/etc/logstash/conf.d/30-lumberjack-output.conf

output {
  elasticsearch { host => localhost }
#  stdout { codec => rubydebug }
}

если полезно, конфигурация logstash-forwarder: /etc/logstash-forwarder на веб-серверах

{
  "network": {
    "servers": [ "123.465.789.123:5000" ],
    "timeout": 45,
    "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
  },
  "files": [
    {
      "paths": [
        "/var/log/messages",
        "/var/log/secure"
       ],
      "fields": { "type": "syslog" }
    },
    {
      "paths": [
        "/home/xnxx/gportal/shared/log/logstash_production.log"
      ],
      "fields": { "type": "rails", "format": "json_event" }
    }
  ]
}

Мои файлы конфигурации в основном вдохновлены этим руководством: https://www.digitalocean.com/community/tutorials/how-to-use-logstash-and-kibana-to-centralize-and-visualize-logs-on-ubuntu-14-04


person Vincent    schedule 18.09.2014    source источник
comment
Как выглядит ваш файл конфигурации logstash? Похоже, вам нужно либо использовать кодек json, либо фильтр, в зависимости от того, как настроен ваш файл конфигурации.   -  person Alcanzar    schedule 18.09.2014
comment
Добавлен Update1 с моей конфигурацией logstash на центральном сервере. Я думаю, что мне нужно добавить новый для рельсов, но я не нашел, как разбирать эти журналы.   -  person Vincent    schedule 18.09.2014
comment
Помогает ли вам добавление моих файлов конфигурации?   -  person Vincent    schedule 29.09.2014


Ответы (2)


Я лично никогда не использовал ввод лесоруба, но похоже, что он должен поддерживать codec=>json, поэтому я не уверен, почему это не так. Вместо этого вы можете попробовать вставить это (в /etc/logstash/conf.d/01-lumberjack-input.conf):

filter {
  json {
    source => 'message'
    remove_field => [ 'message' ]
  }
}
person Alcanzar    schedule 29.09.2014

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

Так что вместо:

sudo service logstash restart

Я сделал:

sudo service logstash stop

подождите ~ 1 минуту, затем

sudo service logstash start

Не совсем понимаю причину (сценарий инициализации делает это, но не ждет 1 минуту), но у меня это сработало.

person Vincent    schedule 30.09.2014