gpt4 book ai didi

python - Tornado - 应用程序和请求日志记录如何工作?

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:39 24 4
gpt4 key购买 nike

我在使用 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 的一部分,有三个潜在的日志可用,理想情况下,我还希望从写入另一个文件的一般日志中报告输出。我读过让 supervisord(或 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

这是我的应用程序 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_logfile 中没有任何记录。我唯一可以将任何内容记录到 stdout_logfile 的情况是,如果我实际上在代码中放置 print 语句并使用 sys.stdout.flush() 刷新缓冲区(或使用 -u 标志启动 python)。

将请求记录到 stdout_logfile、堆栈跟踪和其他应用程序级输出到 stderr_logfile 的正确方法是什么?我想问题的第二部分已经回答了,因为它已经这样做了,但第一部分到目前为止还没有解决。

最佳答案

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

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

关于python - Tornado - 应用程序和请求日志记录如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23795350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com