2010-09-20 24 views
5

Estoy trabajando en una aplicación Pylons que se ejecuta en la parte superior de Apache con mod_wsgi. Me gustaría enviar mensajes de registro que genera mi aplicación a los archivos en el directorio de mi aplicación, en lugar de enviarlos a los registros de Apache. Además, me gustaría especificar la ubicación de los archivos de registro a través de una ruta relativa para que sea más fácil implementar mi aplicación en los servidores de otras personas. Ahora mismo puedo iniciar sesión en los archivos, pero solo a través de una ruta frágil absoluta.Uso de rutas relativas para registrar archivos en Pylon's development.ini

Aquí es la parte pertinente de mi archivo development.ini:

# Logging configuration 
[loggers] 
keys = root, routes, myapp, sqlalchemy, debugging-logger 

[handlers] 
keys = console, debugging-logger-file 

[formatters] 
keys = generic 

[logger_debugging-logger] 
level = DEBUG 
handlers = debugging-logger-file 
qualname = myapp.controllers.logging-test-controller.debugging-logger 

[handler_debugging-logger-file] 
class = FileHandler 
args = ('/var/pylons/myapp/logs/myapp-debugging-errors.log', 'a') 
level = DEBUG 
formatter = generic 

Aunque las ini amablemente aconseja usar% (aquí) s para referirse a la ruta actual, utilizando% (aquí) s en el La línea "args = ('foo')" del controlador de errores no se comporta de la manera que yo esperaba. La sintaxis de este archivo ini es documented on the Paste Deploy site, pero no especifica cómo se puede usar% (here) s en relación con las cadenas entre comillas.

¿Qué sintaxis debo usar en la línea "args = ('foo')" para especificar la ruta actual?

Respuesta

7

El problema es que Paste Deploy crea un objeto ConfigParser para almacenar la etiqueta 'here' en su conjunto de valores predeterminados, y logging.config.fileConfig() nunca pasa ese conjunto de valores predeterminados. Por lo tanto, cuando fileConfig() lee el archivo .ini, no tiene acceso a la etiqueta 'here', y la interpolación de ConfigParser no puede encontrarlo.

se podría hacer algo como esto:

[DEFAULT] 
my_log_dir = '/var/pylons/myapp/logs' 
... 
[handler_debugging-logger-file] 
args = (%(my_log_dir)s + '/myapp-debugging-errors.log', 'a') 

No es exactamente lo que estás buscando, pero un poquito más configurable.

Otra posibilidad es:

args = (os.getcwd() + '/myapp-debugging-errors.log', 'a') 

(Esto funciona porque 'os' es una variable válido en espacio de nombres del módulo de registro cuando se llama a eval() sobre el valor args Pero esto es un detalle de implementación de la. logging package que puede no ser confiable a largo plazo.) Pero es muy probable que esto no le proporcione lo que desea, lo más probable es que use el directorio de trabajo del proceso Apache.

Incluso se podría establecer una variable de entorno fuera del programa, y ​​usarlo como:

args = (os.environ['MY_LOG_DIR'] + '/myapp-debugging-errors.log', 'a') 

Y sin embargo, otra posibilidad es reemplazar el comportamiento de algunas de las funciones o métodos de clase en el módulo de registro o paquete de pasta .

Espero que te den algunas ideas.

+0

Ah, eso me hizo superar la joroba del cerebro. Gracias. Estoy usando la primera opción por ahora, al menos me impide ser notoriamente no SECO, porque estoy dividiendo los mensajes en algunos archivos de registro diferentes. –

0

Los archivos de configuración para Paste Deploy permiten que una etiqueta 'aquí' indique el directorio donde se encuentra el archivo de configuración. Entonces puede trabajar en relación con eso.

+0

He actualizado la pregunta con una aclaración en respuesta a su respuesta. –

Cuestiones relacionadas