ruby-on-rails - 从 Docker 登录

标签 ruby-on-rails docker syslog rsyslog

我有一个通过 docker 运行的 rails 应用程序。我使用 docker-compose 启动应用程序(配置如下)。整个应用程序包括一个mysql、redis、rails(包括sidekiq worker)、nginx(带有react前端)和一个rsyslog服务器,它将所有日志转发到Loggly

我的问题与日志记录部分有关。所有服务的日志基本上都会被转发,除了我来自 sidekiq 的日志。
当我用 bundler exec sidekiq 启动 sidekiq 时日志输出到控制台 (stdout),但是当我在 rsyslog 服务器上跟踪/var/log/messages 时我看不到它们。

在 docker 上设置日志记录时,我遵循了本教程:

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

我的想法是,在 docker 容器中进入 stdout 的所有内容都应该记录到 docker 日志机制中——而我的设置意味着它应该进入 syslog 服务器......

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:

最佳答案

正如@Robert 在评论中所建议的,解决方案是在 docker-compose 文件中将捆绑命令作为 CMD 的一部分运行:
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"

关于ruby-on-rails - 从 Docker 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44414084/

相关文章:

docker - 将 AWS Codebuild 环境变量注入(inject) Dockerfile

docker - 如何使用 Docker Compose 设置 Dockerfile 的 "current"目录?

docker - docker 容器的双向 UDP 端口

java - 将 Java syslog 客户端配置为信任自签名证书

c++ - 如何从Syslog-NG/Syslog获取数据

ruby-on-rails - 未定义的方法 `length' 为 nil :NilClass

ruby-on-rails - 如何让故事与 Restful 身份验证和 cucumber 一起工作?

ruby-on-rails - 用于 ruby​​ on rails 的 OrientDB 集成

javascript - Stripe::InvalidRequestError(必须提供来源或客户。):Stripe

twisted - 如何将结构化数据从 Twisted 发送到系统日志?