В статье я описывал как настроить систему сбора логов на baremetal.
В данной статье мы расмотрим как сделать такую же систему только с помощью Docker.
Принцип работы ELK stack:
FileBeat | Служит для отправки логов в Logstash или в Elasticsearch |
Logstash | Индексирование логов |
ElasticSearch | Используется для храненния логов |
Kibana | Веб-интерфейс для поиска и отображения логов |
Nginx | Веб сервер для проксирования |
Написания Dockerfile и docker-compose
1. ELK stack
Структура директорий:
1 2 3 4 5 |
. ├── docker-compose.yml └── logstash ├── Dockerfile └── logstash.conf |
Logstash Dockerfile:
Создаем директорию resources и файл Dockerfie
1 2 |
mkdir resources nano Dockerfile |
1 2 3 4 5 |
FROM logstash COPY logstash.conf / CMD ["-f", "/logstash.conf"] |
Logstash resources/logstash.conf:
1 |
resources/logstash.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
input { beats { port => 5044 } } output { elasticsearch { hosts => "elasticsearch:9200" manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } } |
Logstash docker-compose.yml
1 |
nano docker-compose.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
version: '2' services: kibana: restart: unless-stopped hostname: kibana.example.com image: kibana links: - elasticsearch ports: - 127.0.0.1:5601:5601 container_name: kibana logstash: restart: unless-stopped hostname: logstash.example.com build: ./logstash ports: - 127.0.0.1:32800:5044 links: - elasticsearch container_name: logstash elasticsearch: restart: unless-stopped hostname: elasticsearch.example.com image: elasticsearch volumes: - /docker_storage/elk/elasticsearch/data:/usr/share/elasticsearch/data container_name: elasticsearch |
Запускаем ELK stack
1 |
docker-compose up -d |
2. Настройка NGINX
Настраиваем NGINX, в директории /etc/nginx/conf.d создадим файл elk.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { listen 80; server_name elk.example.com; client_max_body_size 2048M; root /var/www/html; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:5601; proxy_read_timeout 90; } } |
Рестартуем наш NGINX и заходим по хостнейму. Если все заработало то должны увидеть веб-приложение.
1 |
service nginx restart |
3. FileBeat и логи Postifix
Структура директорий:
1 2 3 4 5 6 7 8 9 10 |
├── docker-compose.yml ├── filebeat │ ├── Dockerfile │ └── resources │ ├── filebeat.yml | └── elastic.repo ├── postfix │ ├── Dockerfile │ └── resources │ └── main.cf.j2 |
Postfix Dockerfile:
1 2 3 4 5 6 7 8 9 10 11 |
FROM centos MAINTAINER Roman Pridybailo <drake0103@gmail.com> RUN yum install -y postfix postfix-perl-scripts mailx python-pip RUN pip install --upgrade pip && pip install j2cli && pip install j2cli[yaml] RUN j2 /resources/main.cf.j2 > /etc/postfix/main.cf WORKDIR /etc/postfix CMD ["/usr/sbin/postfix", "-c", "/etc/postfix", "start"] |
Postfix resources/main.cf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix mail_owner = postfix inet_interfaces = all inet_protocols = all myhostname = {{ MAIL_HOSTNAME }} myorigin = $mydomain mydestination = {{ MAIL_HOSTNAME }}, localhost unknown_local_recipient_reject_code = 550 alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix-2.10.1/samples readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES relayhost = mailbox_size_limit = 51200000 message_size_limit = 10240000 recipient_delimiter = + mynetworks = 172.17.0.0/16 smtpd_client_restrictions = permit_mynetworks, reject |
FileBeat Dockerfile:
1 2 3 4 5 6 7 8 9 10 11 12 |
FROM centos MAINTAINER Roman Pridybailo <drake0103@gmail.com> RUN yum update -y && rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch COPY resources/elastic.repo /etc/yum.repos.d/ RUN yum install -y filebeat COPY resources/filebeat.yml /etc/filebeat/filebeat.yml WORKDIR /etc/filebeat CMD ["filebeat.sh", "-e", "-c", "/etc/filebeat/filebeat.yml"] |
FileBeat resources/filebeat.yml:
1 2 3 4 5 6 7 8 9 10 11 |
filebeat.prospectors: - input_type: log paths: - /logs/postfix/maillog document_type: postfix output.logstash: hosts: ["elk.example.com:5044"] tags: ["mail", "postfix"] |
filebeat.prospectors | Секция для описания настроек filebeat |
input.type | Тип входящей информации (log, stdin) |
paths | Путь к логам |
output.logstash | Секция отправки обработанных логов в logstash |
hosts | Имя сервера logstash |
tags | Теги filebeat, для удобной сортировки |
FileBeat resources/elastic.repo
1 2 3 4 5 6 7 8 |
[elastic-5.x] name=Elastic repository for 5.x packages baseurl=https://artifacts.elastic.co/packages/5.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md |
docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
filebeat: build: ./filebeat restart: always volumes: - /docker_storage/logs/postfix:/logs/postfix hostname: filebeat-postfix postfix: build: ./postfix restart: always ports: - "25:25" environment: - TERM=xterm - MAIL_HOSTNAME=mail.example.com volumes: - /docker_storage/logs/postfix:/var/log/postfix |
Запускаем filebeat с postfix
1 |
docker-compose up -d |
Настройка визуализации логов
Переходим по нашему хостнейму http://elk.example.com. Указываем индекс filebeat-*
Что б найи логи по отправленным письмам пишем в поиске:
1 |
postfix AND sent |
Где:
postfix | В данном случае название тега |
AND | Указывает что искать надо по двум совпадениям |
sent | Статус отправки |
Сохраняем поиск, это нужно будет для отрисовки графиков
Тоже самое делаем для deferred и bounced
Далее заходим в Visualize -> PieChart. И добавляем наши сохраненные поиски
Для настройки Dasboard заходим в Dasboard -> Add. И дабвляем наш график
Тут уже все зависит от нашей фантазии и требований к системе. В итоге получится вот такое:
На этом все. Спасибо за внимание