2009-09-10 12 views
25

Ich verwende das Standard-Python (2.5.2) Logging-Modul, insbesondere den RotatingFileHandler, auf einem Linux-System. Meine Anwendung unterstützt sowohl eine Befehlszeilenschnittstelle als auch eine Webservice-Schnittstelle. Ich möchte beide in dieselbe Protokolldatei schreiben. Wenn die Protokolldatei jedoch gedreht wird, verfügt die neue Datei über 644 Berechtigungen und gehört dem Webserver-Benutzer, der verhindert, dass der Befehlszeilenbenutzer darauf schreibt. Kann ich angeben, dass neue Protokolldateien in der Protokollierungskonfiguration oder während der Protokollierung initialisiert werden sollen?Ermöglicht python logging.handlers.RotingFileHandler die Erstellung einer schreibbaren Protokolldatei für Gruppen?

Ich habe in die 'Modus' Einstellung (r/w/a) geschaut, aber es scheint keine Dateiberechtigungen zu unterstützen.

Antwort

15

Ich suchte das logging.handlers-Modul ab und konnte keine Möglichkeit sehen, einen anderen Dateiberechtigungsmodus anzugeben. Daher habe ich jetzt eine Lösung, die den RotatingFileHandler als benutzerdefinierten Handler erweitert. Es war ziemlich schmerzlos, sobald ich ein paar nette Referenzen gefunden habe. Der Code für den benutzerdefinierten Handler ist unten.

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) 

Ich entdeckte, dass auch die benutzerdefinierten Handler aus einer Logging-config-Datei zu verweisen, hatte ich mein Modul an den Logging-Namensraum zu binden. Einfach zu machen, aber nervig.

from mynamespace.logging import custom_handlers 
logging.custom_handlers = custom_handlers 

Referenzen Ich fand nützlich: binding custom handlers und creating custom handlers

+0

Ich war nur etwa die gleiche Lösung schreiben: P –

+2

Eine Sache aus dieser Lösung fehlt macht den chmod beim Erstellen der Protokolldatei beim ersten Erstellen. –

+0

Wie behebst du das? Das erste Mal Dateierstellung – ducu

25

Hier ist eine etwas bessere Lösung. Dies überschreibt die Methode _open, die verwendet wird. Setzen Sie die Umask vor dem Erstellen, und geben Sie sie dann zurück zu dem, was sie war.

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

Was passiert, wenn die Anwendung beim Öffnen abstürzt? Bleibt die Umask gesetzt mit 0o002 –

+1

@BenjaminToug Ich denke, es ist spezifisch für diesen Prozess und hat keinen Einfluss auf die Standard-Umask des Systems. –

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