2010-10-30 14 views
5

Tengo problemas con el inicio de sesión. Estoy ejecutando CherryPy 3.2 y he estado leyendo los documentos here, pero no he encontrado ningún ejemplo de cómo configurar un archivo de registro local para la salida y cómo escribir en él.CherryPy Logging: ¿Cómo configuro y uso los registradores globales y de nivel de aplicación?

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) 

ACTUALIZACIÓN: Aquí está el bloque de código que terminé yendo 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) 

Respuesta

10

Simplificando un poco:

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

Si desea diferentes registros por día, use un RotatingFileHandler como se describe en http://www.cherrypy.org/wiki/Logging#CustomHandlers El punto importante que creo que se está perdiendo es que usted debe perder el tiempo con la aplicación .log solo después de ha instanciado su aplicación (por ejemplo, a través de tree.mount(), como se indicó anteriormente), pero antes de engine.start. Es decir, para el registro de errores:

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

Espero que ayude ...