blog-public/content/post/logs-to-remote-logstash.md
Denis Zheleztsov a5dd73f274 Initial public
Some content was deleted before this project
has been moved to public
2021-10-18 19:45:57 +03:00

2.8 KiB
Raw Blame History

+++ date = "2017-09-02T16:28:50+03:00" draft = false title = "Отправляем логи в удаленный logstash" tags = ["linux", "elasticsearch", "logstash"] commets = true +++

Все привыкли пользоваться связкой 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

Использование памяти пол-мегабайта :).