Логирование из Docker

У меня есть приложение rails, работающее через докер. Я запускаю приложение с помощью docker-compose (конфигурация ниже). Все приложение охватывает mysql, redis, rails (включая рабочих sidekiq), nginx (с реагирующим внешним интерфейсом) и сервер rsyslog, который перенаправляет все журналы в Loggly.

Моя проблема связана с частью ведения журнала. Журналы со всех сервисов в основном пересылаются, кроме моих журналов от sidekiq. Когда я запускаю sidekiq с bundler exec sidekiq, журналы выводятся на консоль (stdout), но я не вижу их, когда захожу в /var/log/messages на сервере rsyslog.

Я следовал этому руководству при настройке ведения журнала в докере:

https://medium.com/@yoanis_gil/logging-with-docker-part-1-b23ef1443aac

Я думаю, что все, что отправляется на стандартный вывод в контейнере докеров, должно регистрироваться в механизме журнала докеров, и с моей настройкой это означает, что оно должно отправляться на сервер системного журнала...

Файл docker-compose:

version: '3'

services:
  nginx:
    image: nginx
    depends_on:
      - api
      - syslog
    ports:
      - "80:8080"

    logging:
      driver: syslog
      options:
        syslog-facility: "daemon"
        tag: "nginx"
        syslog-address: "tcp://localhost:5514"
    networks:
      - phototankswarm
    env_file: .env.dev
    volumes:
      - ./frontend/nginx/conf.d:/etc/nginx/conf.d
      - ./frontend/public:/www

  db:
    image: mysql
    env_file: .env.dev
    depends_on:
      - syslog
    networks:
      - phototankswarm
    ports:
      - "3306:3306"
    volumes:
      - ./backend/sql/data:/var/lib/mysql
    logging:
      driver: syslog
      options:
        syslog-facility: "daemon"
        tag: "mysql"
        syslog-address: "tcp://localhost:5514"

  redis:
    image: redis
    depends_on:
      - syslog
    networks:
      - phototankswarm
    logging:
      driver: syslog
      options:
        syslog-facility: "daemon"
        tag: "redis"
        syslog-address: "tcp://localhost:5514"

  api:
    image: pt-rails
    env_file: .env.dev
    networks:
      - phototankswarm
    command: >
      sh -c '
      rails s -p 3000 -b 0.0.0.0;
      '
    volumes:
      - /Users/martinhinge/Pictures/docker/phototank:/media/phototank
      - ./backend:/usr/src/app
    ports:
      - "3000:3000"
    depends_on:
      - db
      - redis
      - syslog
    logging:
      driver: syslog
      options:
        syslog-facility: "daemon"
        tag: "rails"
        syslog-address: "tcp://localhost:5514"

  syslog:
    image: syslog
    ports:
      - "localhost:5514:514"
    networks:
      - phototankswarm
    volumes:
      - /tmp:/var/log/syslog

networks:
  phototankswarm:

person martin    schedule 07.06.2017    source источник
comment
Вы запускаете приложение с помощью бандлера или рельсов? я вижу rails s -p 3000 -b 0.0.0.0   -  person Robert    schedule 07.06.2017
comment
@ Роберт, хорошая мысль ... я пока не работал с помощником над скриптом докера. Я запускаю приложение rails в соответствии с вашим комментарием и запускаю sidekiq, войдя в контейнер и запустив его: docker exec -it 8d092f6b4d55 bundle exec sidekiq   -  person martin    schedule 07.06.2017
comment
Это ключ. Вывод bundle перенаправляется на ваш терминал вместо стандартного вывода контейнера. Вам нужно будет запустить пакет внутри вашей команды или точки входа. Так что я думаю, вам нужно запустить оба рельса и связки там.   -  person Robert    schedule 07.06.2017


Ответы (1)


Как предложил @Robert в комментариях, решение состоит в том, чтобы запускать команды пакета как часть CMD в файле docker-compose:

Таким образом, служба api в моем файле компоновки становится:

api:
    image: pt-rails
    env_file: .env.dev
    networks:
      - phototankswarm
    command: >
      sh -c '
      bundle exec sidekiq -d -L /dev/stdout && bundle exec rails s -p 3000 -b 0.0.0.0  
      '
    volumes:
      - /Users/martinhinge/Pictures/docker/phototank:/media/phototank
      - ./backend:/usr/src/app
    ports:
      - "3000:3000"
    depends_on:
      - db
      - redis
      - syslog
    logging:
      driver: syslog
      options:
        syslog-facility: "daemon"
        tag: "rails"
        syslog-address: "tcp://localhost:5514"
person martin    schedule 07.06.2017