Я решил пойти с регистратором, который установлен глобально;и затем включите его только тогда, когда команда управления была запущена из командной строки.
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