2016-06-13 131 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