龙卷风 - 应用程序和请求记录如何工作?

时间:2014-05-21 23:11:48

标签: python logging tornado supervisord

我正在使用Amazon Linux AMI在AWS EC2上使用tornado 3.2.1,python 2.7.3,supervisord 3.0。

我正在尝试获取请求级别日志记录(例如“200 POST /(127.0.0.1)0.75ms”(这是请求级别日志记录的定义,对吗?))写入日志文件和异常堆栈跟踪登录到另一个日志文件。我从here看到有三个可能的日志作为Tornado的一部分可用,理想情况下,我也喜欢从一般日志写入到另一个文件的报告输出。我已经阅读了更好的主管(或者除了Tornado之外的东西)处理日志文件的写入。

我的supervisord.conf看起来像这样:

[unix_http_server]
file=/var/lib/supervisor/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/lib/supervisor/supervisor.sock ; use a unix:// URL  for a unix socket

[include]
files=supervisord.d/*.ini

这是我的app supervisord ini文件:

[program:myapp]
process_name=myapp%(process_num)s
directory=/opt/me/venvs/myapp
command=/opt/me/venvs/myapp/bin/python /opt/me/venvs/myapp/bin/run_myapp.py --port=%(process_num)s --logging=DEBUG
startsecs=2
user=me
stdout_logfile=/var/log/myapp/access-%(process_num)s.log
stderr_logfile=/var/log/myapp/error-%(process_num)s.log
numprocs=2
numprocs_start=14000

我在run_myapp.py

的底部有这段代码片段
if __name__ == "__main__":
    tornado.options.define("port", default=7777, help="run on the given port", type=int)
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(tornado.options.options.port)
    tornado.ioloop.IOLoop.instance().start()

似乎发生的事情是请求级别信息,堆栈跟踪和logging.info('doing something...')的使用全部记录到supervisord stderr_logfile变量指定的文件中。没有任何内容记录到stdout_log文件中。我唯一可以记录到stdout_logfile的是我是否在代码中放了print语句并使用sys.stdout.flush()来刷新缓冲区(或者用-u标志启动python)。

将stdout_logfile,stacktraces和其他应用程序级别输出的请求记录到stderr_logfile的正确方法是什么?我想这个问题的第二部分已经回答了,因为它已经在做了,但第一部分到目前为止尚未解决。

1 个答案:

答案 0 :(得分:0)

parse_command_line中的Tornado内置日志配置无法帮助您分离日志流 - 您必须设置tornado.options.options.logging = None并直接在python日志记录模块中管理您自己的配置。

Supervisord只能处理两个日志文件(stdout和stderr),所以你不能让supervisord处理你的日志文件并进行细粒度分离,但你可以有两个流。配置tornado.access记录器以使用propagate = False写入stdout,并将根记录器写入stderr。然后你可以在supervisord中为两个流提供不同的输出文件。