Logstasher+Kibana: сообщение заключено в двойные кавычки и трудно разобрать
Я использую этот стек:
- На каждом фронт-сервере
- рельсы
- logstasher gem (форматы рельсов войти в json)
- logstash-forwarder (просто пересылает логи в logstash на центральном сервере)
- На лог-сервере:
- logstash (для централизации и индексации журналов)
- кибана для отображения
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
2 ответа
Последним способом было остановить и запустить logstash, в противном случае (перезапустить) конфигурация, похоже, не будет обновлена.
Так что вместо:
sudo service logstash restart
Я сделал:
sudo service logstash stop
подождите ~1 минуту, затем
sudo service logstash start
Не совсем понимаю причину (скрипт инициализации делает это, но не ждет 1 минуту), но у меня это сработало.
Я никогда лично не использовал вход дровосека, но похоже, что он должен поддерживать codec=>json
Я не уверен, почему это не так. Вы можете попробовать вставить это вместо (в /etc/logstash/conf.d/01-lumberjack-input.conf
):
filter {
json {
source => 'message'
remove_field => [ 'message' ]
}
}