Собираем логи из docker в GrayLog

logspout

Последнее время я все чаще стал ходить на сервера и смотреть логи руками. Но доккер так устроен, что найти что-то в логах крайне сложно. В результате я пришел к выводу, что пора собирать логи где-то в ElasticSearch.

Классический ELK я не очень люблю, а потому стал искать варианты, которые мне бы понравились. В итоге, пришел к GrayLog.

Оставался вопрос сборщика логов, для отправки их в GrayLog, который сложит их в ElasticSearch.

Перебрал кучку малую и остановился на Logspout. Он умеет отправлять логи в syslog, GELF и, что не маловажно, он умеет multiline logs. Т.е. Tracebacks будут не построчно, а целиком, как положено.

Ну что ж, поднимаем. Начнем с GrayLog. Поднимаем с помощью docker-compose:

version: '3'

services:
mongodb:
    image: mongo:4.1
    container_name: mongodb
    restart: always
    volumes:
      - mongodata:/data/db:rw

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.2
    container_name: elasticsearch
    restart: always
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata1:/usr/share/elasticsearch/data:rw

  graylog:
    image: graylog/graylog:3.1
    container_name: graylog
    restart: always
    environment:
      - GRAYLOG_PASSWORD_SECRET=$uperP00perPa$$sw0rd
      # Password: admin
      - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
      - GRAYLOG_HTTP_EXTERNAL_URI=http://graylog.example.com:9000/
      - GRAYLOG_TRANSPORT_EMAIL_ENABLED=true
      - GRAYLOG_TRANSPORT_EMAIL_HOSTNAME=smtp.gmail.com
      - GRAYLOG_TRANSPORT_EMAIL_PORT=587
      - GRAYLOG_TRANSPORT_EMAIL_USE_AUTH=true
      - GRAYLOG_TRANSPORT_EMAIL_USE_TLS=true
      - GRAYLOG_TRANSPORT_EMAIL_AUTH_USERNAME=noreply@example.com
      - GRAYLOG_TRANSPORT_EMAIL_AUTH_PASSWORD=password
      - GRAYLOG_TRANSPORT_EMAIL_SUBJECT_PREFIX=[graylog]
      - GRAYLOG_TRANSPORT_EMAIL_FROM_EMAIL=noreply@example.com
    links:
      - mongodb:mongo
      - elasticsearch
    depends_on:
      - mongodb
      - elasticsearch
    ports:
      # HTTP
      - 9000:9000
      # Syslog TCP
      - 1514:1514
      # Syslog UDP
      - 1514:1514/udp
      # GELF TCP
      - 12201:12201
      # GELF UDP
      - 12201:12201/udp

volumes:
  esdata1:
    driver: local
  mongodata:
    driver: local

Не забудьте подправить переменные окружения.

Теперь логинимся в сам GrayLog и настраиваем входящий поток. Для этого переходим в System - Input и выбираем из выпадающего списка Syslog UDP, нажимаем Launch new input. Откроется окно настроек. Нас интересует всего две вещи:

  1. Global - включаем ее
  2. Port - должен быть 1514

Нажимаем Save и после этого поток должен запуститься и начать слушать входящие данные.

Осталось добавить сборщик логов Logspout. Кусок docker-compose.yml:

  logspout:
    image: gliderlabs/logspout:latest
    container_name: logspout
    restart: always
    volumes:
      - /etc/hostname:/etc/host_hostname:ro
      - /var/run/docker.sock:/var/run/docker.sock
    command:
      multiline+syslog://graylog:1514

Применяем:

docker-compose up -d

После этого в GrayLog должны пойти логи. Просто перейдите на страницу Search и вы их увидите.



Комментарии: