【问题标题】:How to store Tornado logs to a file?如何将 Tornado 日志存储到文件中?
【发布时间】:2016-06-13 23:14:07
【问题描述】:

如果连续 30 分钟未访问 API,我的服务器会抛出 500 错误。为了检查问题,我需要跟踪每个 API 请求。我在 Flask 前使用 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()

【问题讨论】:

    标签: python flask tornado


    【解决方案1】:

    你使用了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()
    

    【讨论】:

    • 非常感谢!内置龙卷风选项完全有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多