Se stai rotolare la vostra soluzione, si dovrebbe scrivere un semplice plugin bottiglia che emette le linee di log ad un logging
logger. Ecco un esempio che imposta un logger di base, definisce il plug-in di registrazione e crea un'app Bottle con quel plug-in installato su tutte le rotte.
from bottle import Bottle, request, response
from datetime import datetime
from functools import wraps
import logging
logger = logging.getLogger('myapp')
# set up the logger
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler('myapp.log')
formatter = logging.Formatter('%(msg)s')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
def log_to_logger(fn):
'''
Wrap a Bottle request so that a log line is emitted after it's handled.
(This decorator can be extended to take the desired logger as a param.)
'''
@wraps(fn)
def _log_to_logger(*args, **kwargs):
request_time = datetime.now()
actual_response = fn(*args, **kwargs)
# modify this to log exactly what you need:
logger.info('%s %s %s %s %s' % (request.remote_addr,
request_time,
request.method,
request.url,
response.status))
return actual_response
return _log_to_logger
app = Bottle()
app.install(log_to_logger)
@app.route('/')
def home():
return ['hello, world']
app.run(host='0.0.0.0', port='8080', quiet=True)
esecuzione che il codice cede ciò che si vuole:
% python myapp.py &
% curl -v http://localhost:8080/
% tail myapp.log
127.0.0.1 2015-06-27 16:57:09.983249 GET http://localhost:8080/ 200 OK
fonte
2015-06-27 20:57:45
Hai accettato la risposta di ayb, ma per favore considera di cambiarlo. Non è necessario accettare il mio (a meno che non si pensi che sia la risposta corretta migliore), ma preferirei non vedere i futuri visitatori di questa domanda essere fuorviati dal codice di ayb, che non dovrebbe essere usato se non nelle applicazioni più leggere (e anche allora , è una pratica discutibile). –