2009-09-10 12 views
25

Sto usando il pitone standard (2.5.2) modulo di registrazione, in particolare il RotatingFileHandler, su un sistema Linux. La mia applicazione supporta sia un'interfaccia della riga di comando che un'interfaccia del servizio web. Mi piacerebbe che entrambi scrivessero sullo stesso file di registro. Tuttavia, quando il file di registro viene ruotato, il nuovo file ha 644 autorizzazioni ed è di proprietà dell'utente del server Web che impedisce all'utente della riga di comando di scrivervi. Posso specificare che i nuovi file di registro devono essere scrivibili in gruppo nella configurazione di registrazione o durante l'inizializzazione della registrazione?python logging.handlers.RotatingFileHandler consente la creazione di un file di registro scrivibile di gruppo?

ho guardato in 'modalità' impostazione (r/w/a), ma non sembra supportare eventuali permessi dei file.

risposta

15

ho fatto ricorso alla scansione del modulo logging.handlers ed era in grado di vedere alcun modo per specificare una diversa modalità di permessi dei file. Quindi, ora ho una soluzione basata sull'estensione del RotatingFileHandler come gestore personalizzato. E 'stato abbastanza indolore, una volta ho trovato dei buoni riferimenti per crearne uno. Il codice per il gestore personalizzato è sotto.

class GroupWriteRotatingFileHandler(handlers.RotatingFileHandler): 

    def doRollover(self): 
     """ 
     Override base class method to make the new log file group writable. 
     """ 
     # Rotate the file first. 
     handlers.RotatingFileHandler.doRollover(self) 

     # Add group write to the current permissions. 
     currMode = os.stat(self.baseFilename).st_mode 
     os.chmod(self.baseFilename, currMode | stat.S_IWGRP) 

ho anche scoperto che per fare riferimento al gestore personalizzato da un file di log di configurazione, ho dovuto legare il mio modulo per lo spazio dei nomi di registrazione. Semplice da fare, ma fastidioso.

from mynamespace.logging import custom_handlers 
logging.custom_handlers = custom_handlers 

Riferimenti ho trovato utile: binding custom handlers e creating custom handlers

+0

Stavo per pubblicare la stessa soluzione: P –

+2

Una cosa che manca da questa soluzione sta facendo il chmod sulla creazione del file di registro la prima volta che viene creato. –

+0

Come lo risolvi? La prima volta la creazione di file – ducu

25

Ecco una soluzione leggermente migliore. questo sovrascrive il metodo _open che viene utilizzato. impostando la umask prima di crearla, quindi tornare a ciò che era.

class GroupWriteRotatingFileHandler(logging.handlers.RotatingFileHandler):  
    def _open(self): 
     prevumask=os.umask(0o002) 
     #os.fdopen(os.open('/path/to/file', os.O_WRONLY, 0600)) 
     rtv=logging.handlers.RotatingFileHandler._open(self) 
     os.umask(prevumask) 
     return rtv 
+0

Che se l'applicazione si blocca durante l'apertura? Fa l'umask soggiorno set con 0o002 –

+1

@BenjaminToueg Penso che sia specifico per quel processo e non influenza l'umask di default del sistema. –

0
$ chgrp loggroup logdir 
$ chmod g+w logdir 
$ chmod g+s logdir 
$ usermod -a -G loggroup myuser 
$ umask 0002 
Problemi correlati