2016-06-13 3 views
6

Я столкнулся с проблемами, когда мой сервер бросает 500, если API не получает доступа в течение 30 минут. Чтобы проверить проблему, мне нужно отслеживать каждый сделанный запрос API. Я использую Торнадо перед флягой. Это мой код:Как хранить журналы Tornado в файл?

import tornado.httpserver 
import tornado.ioloop 
import tornado.web 
from flasky import app 
from tornado.wsgi import WSGIContainer 
from tornado.ioloop import IOLoop 
from tornado.web import FallbackHandler 

from tornado.log import enable_pretty_logging 
enable_pretty_logging() 


tr = WSGIContainer(app) 

application = tornado.web.Application([ 
    (r".*", FallbackHandler, dict(fallback=tr)), 
]) 

if __name__ == '__main__': 
    application.listen(5000) 
    IOLoop.instance().start() 

Каков наиболее эффективный способ хранения журналов в каком-либо файле?

Я пытался сделать это, но она работает только тогда, когда процесс завершается с 0:

import sys 
import time 
timestr = time.strftime("%Y%m%d-%H%M%S") 
filename = "C:/Source/logs/" + timestr + ".log" 

class Logger(object): 
    def __init__(self): 
     self.terminal = sys.stdout 
     self.log = open(filename, "a") 

    def write(self, message): 
     self.terminal.write(message) 
     self.log.write(message) 

    def flush(self): 
     pass 

sys.stdout = Logger() 

ответ

11

Вы использовали enable_pretty_logging, что хорошо, и если вы можете заметить, документация говорит, что вы можете передать в регистраторе. Итак, что такое регистратор? Оказывается, Python имеет очень обширную поддержку для протоколирования действий через встроенный модуль logging (что также упоминается в документации). Как правило, вам необходимо установить обработчик, которые пишут в какой-то конкретный файл, который вы можете сделать по

handler = logging.FileHandler(log_file_filename) 
logger.addHandler(handler) 
logger.setLevel(logging.INFO) 
logger.info('foo') 

это будет регистрировать все записи Информации на уровне (или выше) в файл. Эти регистраторы могут быть собраны с помощью функции logging.getLogger, и вы можете явно указать их в соответствии с документацией по смерча

access_log = logging.getLogger("tornado.access") 
app_log = logging.getLogger("tornado.application") 
gen_log = logging.getLogger("tornado.general") 

Просто добавьте обработчик к регистратору, создающего сообщения, которые вы хотите записать в файл. Если это tornado.application генерации сообщения, которые вы хотите видеть

handler = logging.FileHandler(log_file_filename) 
app_log = logging.getLogger("tornado.application") 
enable_pretty_logging() 
app_log.addHandler(handler) 

Или вы можете также использовать встроенные возможности торнадо, которые позволяют это

tornado.options.options['log_file_prefix'].set(log_file_prefix) 
tornado.options.parse_command_line() 
+0

Спасибо так много! Встроенные опции торнадо полностью работали. – 90abyss

Смежные вопросы