2017-06-07 193 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"