Позволяет ли python logging.handlers.RotatingFileHandler создавать файл журнала, доступный для записи в группе? - PullRequest
30 голосов
/ 11 сентября 2009

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

Я посмотрел на настройку режима (r / w / a), но, похоже, он не поддерживает какие-либо разрешения для файлов.

Ответы [ 5 ]

30 голосов
/ 21 июля 2011

Вот немного лучшее решение. это переопределяет используемый метод _open. установить 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
19 голосов
/ 11 сентября 2009

Я прибег к сканированию модуля 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 голосов
/ 02 августа 2018

Вот полное решение для Django, основанное на решении rob . в my_module:

import logging
import logging.handlers
import os

Значение class=, которое происходит во время конфигурации ведения журнала, оценивается в пространстве имен модуля ведения журнала, и по умолчанию оно не имеет привязки к обработчикам. Таким образом, мы должны вставить это явно, прежде чем мы сможем расширить его. См. эту статью SO

logging.handlers = logging.handlers

Это волшебное заклинание, которое привело меня навсегда, чтобы найти - я не мог поверить, что он что-то сделал! Наконец, класс Джона загрузится без ошибок.

class GroupWriteRotatingFileHandler(logging.handlers.RotatingFileHandler):    
    def _open(self):
        prevumask = os.umask(0o002)
        rtv = logging.handlers.RotatingFileHandler._open(self)
        os.umask(prevumask)
        return rtv

Чтобы использовать это для Django, добавьте следующее в файл настроек

from my_module import GroupWriteRotatingFileHandler
logging.handlers.GroupWriteRotatingFileHandler = GroupWriteRotatingFileHandler

А затем в LOGGING['handlers']['file'] у вас есть

'class': 'logging.handlers.GroupWriteRotatingFileHandler'
1 голос
/ 07 августа 2012

Джеймс Гарднер написал обработчик, который только вращает файлы, но не создает и не удаляет их: http://packages.python.org/logrotate/index.html

0 голосов
/ 30 мая 2016
$ chgrp loggroup logdir
$ chmod g+w logdir
$ chmod g+s logdir
$ usermod -a -G loggroup myuser
$ umask 0002
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...