С Django, как я могу гарантировать, что у команд управления есть пользовательское ведение журнала? - PullRequest
0 голосов
/ 23 мая 2019

Сценарий

Я хочу убедиться (гарантировать), что все управляющие вызовы команд генерируют журналы в определенном месте на основе имени; например команда добавляется в файл с именем для команды:

$ bin / django changepassword ...

$ ls /var/log/django/changepassword.log

$ bin / django shell

$ ls /var/log/django/shell.log

Опция

У меня есть пользовательская конфигурация регистрации, которую я регистрирую в settings.py, но это не то место, где я ожидаю получить такое пользовательское поведение.

Обезьяна что-нибудь исправит? Но что и где?

1 Ответ

0 голосов
/ 25 мая 2019

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

from django.core.management.base import BaseCommand
from logging.handlers import WatchedFileHandler
from logging import Handler, getLogger

LOG = getLogger(__name__)


class ManageCommandLogger(Handler):
    """
    A logger which only enables when you're running manage commands.
    """
    _instance = None

    def __init__(self, filename, mode='a', encoding=None, delay=0):
        self._kwargs = dict(filename=filename, mode=mode, encoding=encoding, delay=delay)
        self._handler = None
        super(ManageCommandLogger, self).__init__()
        self.__class__._instance = self

    @classmethod
    def enable(cls, name, path=None):
        self = cls._instance
        if self._handler:
            return
        if not path:
            self._kwargs['filename'] %= name
        else:
            self._kwargs['filename'] = path
        self._handler = WatchedFileHandler(**self._kwargs)
        self._handler.setFormatter(self.formatter)
        self._handler.level = self.level
        LOG.info("command logging enabled to %s", self._kwargs['filename'])

    def handle(self, record):
        if not self._handler:
            return
        return super(ManageCommandLogger, self).handle(record)

    def emit(self, record):
        if not self._handler:
            return
        self._handler.emit(record)


def _patch_run_from_argv(self, *args, **kwargs):
    name = args[0][1]
    ManageCommandLogger.enable(name)
    return self._run_from_argv(*args, **kwargs)


BaseCommand._run_from_argv = BaseCommand.run_from_argv
BaseCommand.run_from_argv = _patch_run_from_argv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...