2016-06-13 14 views
6

Ho riscontrato problemi in cui il mio server lanciava un 500 se non si accede all'API per 30 minuti. Per verificare il problema, devo tenere traccia di ogni singola richiesta API effettuata. Sto usando Tornado di fronte a Flask. Questo è il mio codice finora:Come memorizzare i registri di Tornado in un file?

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() 

cosa è il modo più efficiente per archiviare i registri di qualche file?

Ho provato a fare questo, ma funziona solo quando il processo si chiude con 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() 

risposta

11

Hai utilizzato enable_pretty_logging che è buono, e se si potrebbe notare la documentazione dice che si può passare in un registratore. Quindi cos'è un logger? Risulta che Python ha un supporto molto esteso per le azioni di registrazione attraverso il modulo integrato logging (che è menzionato anche nella documentazione). In generale, è necessario impostare i gestori che scrivono alcuni file specifico, che si può fare da

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

Questo registrerà tutte le voci su di me Livello (o superiore) nel file. Questi logger possono essere raccolti dalla funzione logging.getLogger, ed è possibile selezionare in modo esplicito questi come per la documentazione di tornado dal

access_log = logging.getLogger("tornado.access") 
app_log = logging.getLogger("tornado.application") 
gen_log = logging.getLogger("tornado.general") 

È sufficiente aggiungere il vostro gestore per il logger che genera i messaggi che si desidera accedere a un file. Se è il tornado.application generare i messaggi che si desidera visualizzare

handler = logging.FileHandler(log_file_filename) 
app_log = logging.getLogger("tornado.application") 
enable_pretty_logging() 
app_log.addHandler(handler) 

Oppure si può anche utilizzare le opzioni tornado incorporate che consentono questo

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

Grazie mille! Le opzioni di tornado integrate hanno funzionato completamente. – 90abyss