2010-09-20 25 views
5

Je travaille sur une application Pylons qui s'exécute sur Apache avec mod_wsgi. Je souhaite envoyer des messages de connexion générés par mon application aux fichiers du répertoire de mon application, plutôt qu'aux journaux d'Apache. En outre, je voudrais spécifier l'emplacement des fichiers journaux via un chemin relatif afin qu'il soit plus facile de déployer mon application sur les serveurs d'autres personnes. En ce moment je peux me connecter aux fichiers, mais seulement via un chemin absolu fragile.Utilisation de chemins d'accès relatifs aux fichiers journaux dans le fichier development.ini de Pylons

Voici la partie pertinente de mon dossier 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 

Bien que les .ini en utilisant% conseille obligeamment (ici) s de se référer au chemin courant, en utilisant% (ici) s dans la "args = ('foo')" ligne du gestionnaire d'erreurs ne se comporte pas comme je le souhaite. La syntaxe de ce fichier ini est documented on the Paste Deploy site, mais ne spécifie pas comment% (ici) s peut être utilisé par rapport aux chaînes entre guillemets.

Quelle syntaxe dois-je utiliser dans la ligne "args = ('foo')" pour spécifier le chemin courant?

Répondre

7

Le problème est que Paste Deploy crée un objet ConfigParser pour stocker la balise 'here' dans son ensemble de valeurs par défaut, et logging.config.fileConfig() ne passe jamais cet ensemble de valeurs par défaut. Par conséquent, lorsque fileConfig() lit le fichier .ini, il n'a pas accès à la balise 'here' et l'interpolation de ConfigParser ne le trouve pas.

Vous pouvez faire quelque chose comme ceci:

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

Pas exactement ce que vous cherchez, mais un tout petit peu plus configurable.

Une autre possibilité est:

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

(Cela fonctionne parce que « os » est une variable valide dans l'espace de noms du module d'enregistrement lorsqu'il appelle eval sur la valeur args() Mais ceci est un détail de mise en œuvre du. paquet de journalisation qui peut ne pas être fiable à long terme.) Mais cela probablement ne vous donnera pas ce que vous voulez - il utilisera très probablement le répertoire de travail du processus Apache.

Vous pouvez même définir une variable d'environnement en dehors du programme, et de l'utiliser comme:

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

Et encore une autre possibilité est primordial le comportement de certaines des fonctions ou des méthodes de classe dans le module d'enregistrement ou de l'emballage de pâte .

J'espère que ceux-ci vous donneront quelques idées.

+0

Ah, ça m'a permis de surmonter la bosse du cerveau. Je vous remercie. J'utilise la première option pour l'instant - cela m'empêche au moins d'être incroyablement non-DRY, parce que je divise les messages en quelques fichiers journaux différents. –

0

Les fichiers de configuration de Paste Deploy permettent à une balise 'here' d'indiquer le répertoire où se trouve le fichier de configuration. Vous pouvez alors travailler par rapport à cela.

+0

J'ai mis à jour la question avec une précision en réponse à votre réponse. –