Все привыкли пользоваться связкой ELK. А что делать, если хочется отправить логи в уже существующий ELK с хоста на котором памяти в обрез?
У меня получилось так, что на виртуалке с сайтиком всего 512Мб памяти и логстешь при запуске просто выжирал ее всю и падал. Никакие Xmx Xms не помогали. Самое интересное, что логи-то nginx я заставил писать в JSON, а значит logstash выступает просто проксей до эластика.
Вот так можно заставить писать nginx в JSON. Добавляем это в nginx.conf.
log_format logstash_json '{ "@timestamp": "$time_iso8601", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"body_bytes_sent": "$body_bytes_sent", '
'"request_time": "$request_time", '
'"status": "$status", '
'"request": "$request", '
'"request_method": "$request_method", '
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
А в конфиге сайта
access_log /var/log/nginx/access.log logstash_json;
Собственно пишем конфиг удаленного логстеша:
input {
tcp {
port => 12222
host => "10.8.0.10"
codec => "json"
}
}
output {
elasticsearch {
index => "nginx"
}
}
Теперь делаем скрипт отправки логов:
#!/bin/bash
# /usr/local/bin/logsend.sh
/usr/bin/tail -f /var/log/nginx/access.log | /bin/nc 10.8.0.10 12222
И запиливаем сервис systemd и стартуем его
[Unit]
Description=Send nginx log to remote logstash
[Service]
Type=simple
ExecStart=/usr/local/bin/logsend.sh
[Install]
WantedBy=multi-user.target
systemctl status logsend
● logsend.service - Send nginx log to remote logstash
Loaded: loaded (/etc/systemd/system/logsend.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2017-09-02 12:05:01 UTC; 1h 33min ago
Main PID: 28559 (logsend.sh)
Tasks: 3
Memory: 484.0K
CPU: 12ms
CGroup: /system.slice/logsend.service
├─28559 /bin/bash /usr/local/bin/logsend.sh
├─28562 /usr/bin/tail -f /var/log/nginx/access.log
└─28563 /bin/nc 10.8.0.10 12222
Использование памяти пол-мегабайта :).
Ссылка:
https://difrex.lessmore.pw/post/logs-to-remote-logstash/