通过uwsgi,supervisor和Docker进行Python日志记录

时间:2020-01-13 08:07:48

标签: python docker nginx logging

我在uUWSGI后面的Docker容器中运行一个Python REST API,该容器由Supervisord管理。在本地运行该应用程序时,我的日志会以我想要的方式出现在终端中,但是我无法在容器/生产环境中将其复制到syslog服务器。我经历了很多SO线程,但是标志的组合似乎无法使我的日志记录正常工作。

我的Python日志记录代码,位于main.py中:

formatter = logging.Formatter('%(asctime)s %(request_id)s %(module)s:%(levelname)s %(message)s')
handler = logging.StreamHandler() # have tried forcing this to stderr/stdout
handler.setFormatter(formatter)
handler.addFilter(AppFilter())

application.app.logger.handlers.clear()
application.app.logger.addHandler(handler)
application.app.logger.setLevel(logging.DEBUG)
application.app.logger.debug('application starting...')

上面的代码对于本地终端输出正常工作,这是我尝试将其他软件/服务配置为:

uwsgi.ini:

[uwsgi]
chdir = ./src
wsgi-file = main.py
pythonpath = ./src

master = true
processes = 4
threads = 2

uid = nginx
gid = nginx
socket = /tmp/uwsgi.sock
chown-socket = nginx:nginx
chmod-socket = 664

plugins = python3

supervisord.conf:

[supervisord]
nodaemon=true
user=root

[program:uwsgi]
command=/usr/sbin/uwsgi --ini /etc/uwsgi/uwsgi.ini --die-on-term --log-master
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

最后,将Docker守护程序配置为/etc/docker/daemon.json

{
  "log-driver": "syslog",
  "log-opts": {
    "syslog-address": "tcp://syslog_server_ip_address:514", # IP redacted for stackoverflow
    "tag": "my_api"
  }
}

由于日志必须通过多个级别,因此我不确定自己做错了什么。我的系统日志服务器确实收到每个请求的日志,我认为这是原始的uWSGI日志,但是我无法在容器环境中使用任何Python日志记录代码。

有效的日志如下:

host1.net my_api[1753]: [pid: 12|app: 0|req: 2/2] ip.ip.ip.ip () {36 vars in 432 bytes} [Mon Jan 13 07:58:43 2020] GET /v1/test => generated 25256 bytes in 16 msecs (HTTP/1.0 200) 2 headers in 74 bytes (1 switches on core 1)

感谢任何帮助/指针,谢谢。

0 个答案:

没有答案