Como supones, y puede confirmar mediante el estudio del archivo de origen /usr/local/google_appengine/google/appengine/tools/dev_appserver.py
, los registros no se escriben en el disco (se usa una instancia cStringIO.StringIO
para mantenerlos en la memoria, ya que el resto del código está orientado a escribirlos "en un objeto similar a un archivo").
Lo que yo recomendaría es escribir su propio guión servidor de aplicaciones, que importa dev_appserver
, subclases dev_appserver.ApplicationLoggingHandler
, y anula simplemente uno método:
from google.appengine.tools import dev_appserver
class MyHandler(dev_appserver.ApplicationLoggingHandler):
def __init__(self, *a, **k):
dev_appserver.ApplicationLoggingHandler.__init__(self, *a, **k)
self.thefile = open('/tmp/mylog.txt', 'w')
def emit(self, record):
dev_appserver.ApplicationLoggingHandler(self, record)
self.thefile.write(str(record) + '\n')
self.thefile.flush()
También es necesario asegurarse de esta clase se utiliza en lugar de la estándar, por ejemplo al crear una subclase en el despachador o al asegurar que usa su capacidad de inyección de dependencia. (dev_appserver_main.py
le permite controlar esto mejor, creo).
Creo que este enfoque de personalización es mucho más engorroso de lo que debería (es perfectamente normal querer los registros escritos en el archivo, después de todo, ya sea para mostrarlos de manera diferente, como desee, o para procesarlos luego con algunos script auxiliar), así que también recomendaría poner una solicitud de función en el rastreador del motor de la aplicación: dev_appserver.py
debería aceptar un indicador más, que, si se especifica, proporciona la ruta en la que se escribirán los registros en el disco.
Y, para ser sincero, si necesitara esta característica ahora mismo, lo haría de la manera sucia: editando ese archivo .py
(y su relacionado _main.py
) para agregar dicha marca y su uso. Eso debería ser una docena de líneas en total, mucho más fácil que la manera "canónica" que acabo de delinear. Por supuesto, es sucio porque cada vez que hay un nuevo SDK tendrá que volver a aplicar el parche, una y otra vez ... por lo que uno debería también proponer el parche en el rastreador de GAE, como parte de la solicitud de función sugerí, con la esperanza de que sea aceptada pronto -)
Ya que esto requiere ejecutar el script de todos modos (en lugar de a través del iniciador), simplemente podría ejecutar " dev_appserver.py <...> | tee logfile " –