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

12

我一直面临一个问题,即如果连续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()
1个回答

23
你已经使用了不错的enable_pretty_logging,并且如果你注意到文档上说你可以传递一个 logger。那么什么是logger呢?原来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()

非常感谢!内置的tornado选项完全奏效了。 - 90abyss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接