2010-09-20 12 views
5

Sto lavorando a un'app Pylons che gira su Apache con mod_wsgi. Vorrei inviare i messaggi di registrazione che la mia app genera ai file nella directory della mia app, invece che ai log di Apache. Inoltre, vorrei specificare l'ubicazione dei file di log tramite un percorso relativo in modo che sia più facile distribuire la mia app sui server di altre persone. In questo momento posso accedere ai file, ma solo attraverso un fragile percorso assoluto.Utilizzo dei percorsi relativi per il log dei file nello sviluppo dei piloni.ini

Ecco la parte rilevante del mio file 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 

Anche se i .ini fornisce consulenza utilmente utilizzando% (qui) s per fare riferimento al percorso corrente, utilizzando% (qui) s nel "args = ('foo')" la riga del gestore degli errori non si comporta come mi aspetto. La sintassi di questo file ini è documented on the Paste Deploy site, ma non specifica in che modo% (qui) s può essere utilizzato in relazione alle stringhe tra virgolette.

Quale sintassi dovrei usare nella riga "args = ('foo')" per specificare il percorso corrente?

risposta

7

Il problema è che Paste Deploy crea un oggetto ConfigParser per memorizzare il tag "here" nel set di valori predefiniti e logging.config.fileConfig() non viene mai passato a quell'insieme di valori predefiniti. Pertanto, quando fileConfig() legge il file .ini, non ha accesso al tag "here" e l'interpolazione di ConfigParser non riesce a trovarlo.

Si potrebbe fare qualcosa di simile:

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

Non è esattamente quello che stai cercando, ma un pochino più configurabile.

Un'altra possibilità è:

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

(Questo funziona perché 'os' è una variabile valida nel namespace del modulo di registrazione quando chiama eval() sul valore di args Ma questo è un dettaglio di implementazione del. pacchetto di log che potrebbe non essere affidabile a lungo termine.) Ma probabilmente non ti darà quello che vuoi, molto probabilmente utilizzerà la directory di lavoro del processo Apache.

Si potrebbe anche impostare una variabile di ambiente di fuori del programma, e usarlo come:

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

Eppure Un'altra possibilità è l'override del comportamento di alcune delle funzioni o metodi della classe nel modulo di registrazione o di un pacchetto di pasta .

Spero che quelli ti diano qualche idea.

+0

Ah, questo mi ha fatto superare la gobba del cervello. Grazie. Sto usando la prima opzione per ora - almeno mi impedisce di essere egregiamente non-DRY, perché sto dividendo i messaggi in alcuni file di registro diversi. –

0

I file di configurazione per Paste Deploy consentono un tag "here" per indicare la directory in cui si trova il file di configurazione. Puoi quindi lavorare in relazione a quello.

+0

Ho aggiornato la domanda con un chiarimento in risposta alla risposta. –

Problemi correlati