python - 如何将 Tornado 日志存储到文件中?

标签 python flask tornado

我一直面临这样的问题:如果连续 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()

最佳答案

您已经使用了enable_pretty_logging这很好,如果您可能注意到文档说您可以传入记录器。那么什么是记录器?事实证明,Python 通过内置 logging 对日志记录操作提供了非常广泛的支持。模块(也在文档中提到)。通常,您需要设置写入某些特定文件的处理程序,您可以通过

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

这会将所有信息级别(或更高级别)的条目记录到文件中。这些记录器可以通过 logging.getLogger 函数收集,您可以根据 tornado 文档明确选择这些记录器

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 选项

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

关于python - 如何将 Tornado 日志存储到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37800585/

相关文章:

python - 有谁知道 python 的异步 mysql 库?

python - 您如何使用 tornado.testing 创建 WebSocket 单元测试?

python - 我如何使用 Django 将消息翻译成空字符串

python - 使用 cx_freeze 将 .py 转换为可执行文件时出错

python - MacOS X 上的 pip install lxml 给出错误 : command 'cc' failed

Python & Flask 错误使用 Flask-MySQL |未找到模块错误 : No module named 'flask_mysqldb'

docker - 运行 docker 容器时出错 : starting container process caused "exec:\"python\": executable file not found in $PATH": unknown

python - 在 mavericks 上为 python 安装 opencv

python - 如何使 Flask 流式传输具有 HTTP 206 部分内容的静态文件?

javascript - Tornado、Django 和推送通知