2016-06-13 128 views
6

我一直在面对的问题是,如果API一次不能访问30分钟,我的服务器正在抛出500个问题。为了检查问题,我需要跟踪每一个API请求。我在Flask前面使用了Tornado。这是我的代码到目前为止:如何将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