Nginx:在supervisord下執行nginx時如何使用docker日誌收集器
官方的 nginx docker 鏡像 ( Dockerfile ) 使用以下技巧將其日誌傳遞給 stdout 和 stderr,以便它們被 docker 日誌收集器擷取並可以使用以下方式查看
docker logs <container-name>
:# forward request and error logs to docker log collector RUN ln -sf /dev/stdout /var/log/nginx/access.log RUN ln -sf /dev/stderr /var/log/nginx/error.log
我想做同樣的事情,但是我在容器中將supervisord設置為PID 1,它監督nginx程序並擷取stdout和stderr並將其放入自己的日誌文件中。因此日誌不會到達 docker 日誌收集器。
這是我的 supervisord.conf 中的相關塊
[program:nginx] command=/usr/sbin/nginx -g "daemon off;" priority=990 ; NOTE: We do not want to redirect stdout and stderr of a nginx process to a logfile because we want docker log collector to get them. stdout_logfile= NOT SURE WHAT TO PUT HERE? stderr_logfile= NOT SURE WHAT TO PUT HERE? username=www-data autorestart=true
supervisord 文件很棒(http://supervisord.org/configuration.html)但是因為
stdout_logfile
他們沒有給我我需要的答案 - 即,我如何配置 supervisord 不攔截程序 stdout / stderr (或擷取到日誌文件,但也轉發到正常的標準輸出/標準錯誤)。我已經嘗試過的:
stdout_logfile=NONE
- 不獲取任何日誌,既不標準輸出也不到文件stdout_logfile=/var/log/supervisor/%(program_name)s.log
- 獲取日誌到文件但不是標準輸出。- 未定義
stdout_logfile
- 將日誌獲取到隨機命名的文件,但不是標準輸出。stdout_logfile=/dev/stdout
- Supervisord 給出錯誤:CRIT未擷取的python異常,關閉通道(stdout)>(:
$$ Errno 29 $$非法尋求$$ /usr/lib/python2.7/dist-packages/supervisor/supervisord.py|runforever|233 $$ $$ /usr/lib/python2.7/dist-packages/supervisor/dispatchers.py|handle_read_event|231 $$ $$ /usr/lib/python2.7/dist-packages/supervisor/dispatchers.py|record_output|165 $$ $$ /usr/lib/python2.7/dist-packages/supervisor/dispatchers.py|_log|141 $$ $$ /usr/lib/python2.7/dist-packages/supervisor/loggers.py|info|273 $$ $$ /usr/lib/python2.7/dist-packages/supervisor/loggers.py|log|291 $$ $$ /usr/lib/python2.7/dist-packages/supervisor/loggers.py|emit|186 $$ $$ /usr/lib/python2.7/dist-packages/supervisor/loggers.py|doRollover|195 $$)
該
Illegal seek
錯誤是由負責日誌文件輪換的 supervisord 中的程式碼引起的。要重定向到 stdout/stderr,您必須禁用日誌文件輪換,如下所述:http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html