Вопрос: Tornado - как работает регистрация заявок и запросов?


Я использую tornado 3.2.1, python 2.7.3, supervisord 3.0 на AWS EC2 с использованием AMI Amazon Linux.

Я пытаюсь получить регистрацию уровня запроса (например, «200 POST / (127.0.0.1) 0.75ms» (это определение регистрации уровня запроса, правильно?)) Для записи в файл журнала и трассировки стека исключений для входа в систему другой файл журнала. Я вижу из Вот  что есть три потенциальных журнала, которые доступны как часть 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

Это файл моего супервизора:

[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() для сброса буфера (или запускать python с флагом -u).

Каков правильный способ настроить ведение журнала запросов к файлу stdout_logfile, stacktraces и другим выводам уровня приложения в файл stderr_logfile? Я полагаю, что вторая часть вопроса уже ответила, поскольку это уже делается, но первая часть до сих пор не решена.


4


источник


Ответы:


Встроенная конфигурация журнала Tornado в parse_command_line не может помочь вам в разделении ваших потоков журналов - вам нужно будет установить tornado.options.options.logging = None и самостоятельно управлять собственной конфигурацией в модулях ведения журнала python.

Supervisord может обрабатывать только два файла журнала (stdout и stderr), поэтому вы не можете позволить супервизору обрабатывать ваши файлы журналов и иметь мелкозернистую разметку, но вы можете иметь два потока. Настройте регистратор tornado.access для записи в stdout с помощью функции распространения = False и корневого регистратора для записи в stderr. Затем вы можете передать двум потокам разные выходные файлы в супервизор.


0