2016-04-21 32 views
6

Voglio scrivere alcune informazioni di registro dallo script principale di python in un file in/var/log.La migliore pratica per scrivere i log in/var/log da uno script python?

Quando chiamo logger.info("Starting"), ottengo un PermissionError sul file, cosa abbastanza normale dato che i file in/var/log appartengono a root e il mio programma non viene eseguito come root.

Potrei ovviamente impostare i diritti di /var/log/my.log per consentire a myapp di scrivere in esso. (Impostare lo stesso gruppo, ad esempio). Ma non mi sembra una buona pratica: cosa succede se installo myapp su un altro computer? Dovrei quindi modificare i diritti sul file di registro durante il processo di installazione? O c'è un altro modo più generico per farlo? (Come un modo generico per inviare i registri al "sistema"? Con generico intendo anche portatile, cosa funzionerebbe su linux, freebsd ecc.)

Anche se non sono sicuro che sia rilevante, per informazioni, qui ci sono alcune parti del mio codice:

script principale:

import logging, logging.config 

from lib import settings 
settings.init() 

logging.config.fileConfig(settings.logging_conf_file) 
logger = logging.getLogger(__name__) 

il gestore corrispondenza settings.logging_conf_file, nel file di log di configurazione:

[handler_mainHandler] 
class=FileHandler 
level=INFO 
formatter=defaultFormatter 
filemode=w 
args=('/var/log/myapp.log',) 

risposta

6

Se syslogd è in esecuzione sul vostro box, puoi provare a utilizzare SysLogHandler per evitare problemi con i permessi della cartella (https://docs.python.org/2/library/logging.handlers.html#sysloghandler).

Per specificare la categoria, è necessario impostare il parametro di impianto su desiderato, ad esempio LOG_LOCAL5. In questo caso, corrisponderà a local5. * Categoria di syslogd.

Come si specifica la funzione come parametro del gestore, ma non il nome del file, è necessario regolare la configurazione di syslog per dire syslogd per scrivere i record del registro in un determinato file. In FreeBSD, il file conf di syslog è /etc/syslog.conf (syslog.conf (5)).

Inoltre è possibile aggiungere la mappatura syslog come . in /var/log/all.log per gestire tutti i log di tutti i produttori syslog. È utile determinare se la registrazione funziona e qual è la categoria della tua applicazione, in caso di dubbio.

Per rsyslogd, è possibile avere maggiori informazioni qui: How to configure rsyslog for use with SysLogHandler logging class?

+0

Questo sembra buono per FreeBSD, ma purtroppo la mia macchina Linux non è in esecuzione syslogd per impostazione predefinita. Invece ha rsyslogd e sembra non ascoltare nessuna porta. Devo ancora scoprire come configurarlo correttamente e vedere se SysLogHandler funzionerà anche con rsyslogd. – zezollo

+0

Ancora difficile da configurare. Ho dovuto chiedere [un'altra domanda] (http://stackoverflow.com/questions/36793037/how-to-configure-rsyslog-for-use-with-sysloghandler-logging-class). – zezollo