2010-10-30 10 views
5

Ho problemi con la registrazione. Sto eseguendo CherryPy 3.2 e ho letto i documenti here, ma non ho trovato alcun esempio su come configurare un file di log locale per l'output e su come scriverci.Registrazione CherryPy: come configurare e utilizzare i logger globali e di livello applicazioni?

Raspberry.py:


import socket 
import sys 
import cherrypy 

app_roots = { 
       # Sean's laptop dev environment. 
       "mylaptop": "/home/src/local-mydomain.com/py", 

       # Hosted dev environment. 
       "mydomain.com" : "/home/dev/src/py" 
      } 


hostname = socket.gethostname() 
CherryPyLog = cherrypy.tree.mount().log 

if hostname not in app_roots: 
    CherryPyLog("The following hostname does not have an app_root entry in raspberry.py. Exiting early.") 
    sys.exit() 

sys.stdout = sys.stderr 
sys.path.append(app_roots[hostname]) 

import os 
os.chdir(app_root) 

# Setup for raspberry application logging. 
import datetime 
today = datetime.datetime.today() 
log.access_file = "{0}/{1}.raspberry.access.log".format(app_roots[hostname],today.strftime("%Y%m%d-%H%M")) 
log.error_file = "{0}/{1}.raspberry.error.log".format(app_roots[hostname],today.strftime("%Y%m%d-%H%M")) 

#Testing logger 
log("{0} -- Logger configured".format(today.strftime("%Y%m%d-%H%M%S"))) 

import atexit 
cherrypy.config.update({'environment': 'embedded'}) 

if cherrypy.__version__.startswith('3.0') and cherrypy.engine.state == 0: 
    cherrypy.engine.start(blocking = False) 
    atexit.register(cherrypy.engine.stop) 

from web.controllers.root import RaspberryRequestHandler 

application = cherrypy.Application(RaspberryRequestHandler(), script_name = None, config = None) 

UPDATE: Ecco il blocco di codice che ho finito per andare con.



app_roots = { 
       # Sean's laptop dev environment. 
       "mylaptop": "/home/src/local-plottools.com/py", 

       # Hosted dev environment. 
       "myDomain" : "/home/dev/src/py" 
      } 

import socket 
hostname = socket.gethostname() 

import cherrypy 
import sys 
if hostname not in app_roots: 
    cherrypy.log("The hostname {0} does not have an app_root entry in {1}. Exiting early.".format(hostname,__file__)) 
    sys.exit() 

sys.stdout = sys.stderr 
sys.path.append(app_roots[hostname]) 

import os 
os.chdir(app_roots[hostname]) 

from web.controllers.root import RaspberryRequestHandler 

cherrypy.config.update({ 
    'log.access_file': "{0}/cherrypy-access.log".format(app_roots[hostname]), 
    'log.error_file': "{0}/cherrypy.log".format(app_roots[hostname]), 
    "server.thread_pool" : 10 
}) 

# special case, handling debug sessions when quickstart is needed. 
if __name__ == "__main__": 

    cherrypy.config.update({ 
           'log.screen': True, 
           "server.socket_port": 8000 
          }) 
    cherrypy.quickstart(RaspberryRequestHandler()) 
    sys.exit() 

# This configuration is needed for running under mod_wsgi. See here: http://tools.cherrypy.org/wiki/ModWSGI  
cherrypy.config.update({'environment': 'embedded'}) 

applicationLogName = "{0}/raspberry.log".format(app_roots[hostname]) 

from logging import handlers 
applicationLogFileHandler = handlers.RotatingFileHandler(applicationLogName, 'a', 10000000, 1000) 

import logging 
applicationLogFileHandler.setLevel(logging.DEBUG) 

from cherrypy import _cplogging 
applicationLogFileHandler.setFormatter(_cplogging.logfmt) 

cherrypy.log.error_log.addHandler(applicationLogFileHandler) 

application = cherrypy.Application(RaspberryRequestHandler(), None) 

risposta

10

Semplificando un po ':

import os 
import socket 
import sys 

import cherrypy 

app_roots = { 
       # Sean's laptop dev environment. 
       "mylaptop": "/home/src/local-mydomain.com/py", 

       # Hosted dev environment. 
       "mydomain.com" : "/home/dev/src/py" 
      } 


hostname = socket.gethostname() 
if hostname not in app_roots: 
    cherrypy.log("The hostname %r does not have an app_root entry in " 
       "raspberry.py. Exiting early." % hostname) 
    sys.exit() 

sys.path.append(app_roots[hostname]) 
os.chdir(app_root) 

cherrypy.config.update({ 
    'environment': 'embedded', 
    'log.access_file': "{0}/raspberry.access.log".format(app_roots[hostname]), 
    'log.error_file': "{0}/raspberry.error.log".format(app_roots[hostname]), 
    }) 

from web.controllers.root import RaspberryRequestHandler 
application = cherrypy.tree.mount(RaspberryRequestHandler(), '/') 
# Insert log changes here 
cherrypy.engine.start() 

Se volete diversi registri al giorno, utilizzare un RotatingFileHandler come descritto al http://www.cherrypy.org/wiki/Logging#CustomHandlers Il punto importante penso che ti manca è che si dovrebbe muck circa con app .log solo dopo hai istanziato la tua app (ad esempio tramite tree.mount(), come sopra), ma prima di engine.start. Cioè, per il log degli errori:

application = cherrypy.tree.mount(RaspberryRequestHandler(), '/') 

log = application.log 
log.error_file = "" 

# Make a new RotatingFileHandler for the error log. 
fname = "{0}/raspberry.error.log".format(app_roots[hostname]) 
h = handlers.RotatingFileHandler(fname, 'a', 10000000, 1000) 
h.setLevel(DEBUG) 
h.setFormatter(_cplogging.logfmt) 
log.error_log.addHandler(h) 

cherrypy.engine.start() 

Speranza che aiuta ...

Problemi correlati