2017-06-07 194 views
3

我有一个通过docker运行的rails应用程序。我用Docker-compose调出应用程序(config下面)。整个应用程序涵盖了一个mysql,redis,rails(包括sidekiq workers),nginx(带有react前端)以及一个rsyslog服务器,它将所有日志转发到Loggly从Docker登录

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

我在泊坞窗设置日志时,遵循本教程:

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

我的想法是认为云在泊坞窗容器到stdout一切都应该被记录到泊坞窗日志机制 - 与我设置这意味着它应该去的syslog服务器...

泊坞窗,撰写文件:

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: 
+1

你用bundler或rails启动应用程序?我看到'rails s -p 3000 -b 0.0.0.0' – Robert

+0

@Robert好点...我现在还没有为docker脚本工作过sidekiq。我按照你的评论启动rails应用程序,并且通过登录容器并启动它来启动sidekiq:'docker exec -it 8d092f6b4d55 bundle exec sidekiq' – martin

+1

这是关键。 'bundle'的输出被重定向到你的终端,而不是容器标准输出。您需要在命令或入口点内运行包。所以我想你需要运行两个导轨并捆绑在那里。 – Robert

回答

2

正如评论的解决方案是作为搬运工,撰写文件的CMD的一部分运行包的命令提示由@Robert:

在我撰写文件中的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"