Подтвердить что ты не робот

Поддерживает ли python logging.handlers.RotatingFileHandler создание файла записи для записи в группе?

Я использую стандартный модуль регистрации python (2.5.2), в частности RotatingFileHandler, в системе linux. Мое приложение поддерживает как интерфейс командной строки, так и интерфейс веб-сервиса. Я бы хотел, чтобы оба файла записывались в один и тот же файл журнала. Однако, когда файл журнала поворачивается, новый файл имеет 644 разрешения и принадлежит пользователю веб-сервера, который не позволяет пользователю командной строки писать на него. Могу ли я указать, что новые файлы журналов должны записываться в группу в конфигурации ведения журнала или при инициализации журнала?

Я просмотрел параметр "mode" (r/w/a), но он, похоже, не поддерживает никаких прав на файл.

4b9b3361

Ответ 1

Я прибег к сканированию модуля logging.handlers и не смог найти способ указать другой режим разрешений файлов. Итак, теперь у меня есть решение, основанное на расширении RotatingFileHandler как пользовательского обработчика. Это было довольно безболезненно, как только я нашел хорошие ссылки на его создание. Код для пользовательского обработчика ниже.

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)

Я также обнаружил, что для ссылки на пользовательский обработчик из файла конфигурации протоколирования мне пришлось привязать мой модуль к пространству имен журнала. Простой, но раздражающий.

from mynamespace.logging import custom_handlers
logging.custom_handlers = custom_handlers

Ссылки Я нашел полезным: привязка пользовательских обработчиков и создание пользовательских обработчиков

Ответ 2

Вот немного лучшее решение. это переопределяет используемый метод. установив umask перед созданием, а затем вернув его обратно в то, что было.

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

Ответ 4

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