Skip to content

Instantly share code, notes, and snippets.

@woochica
Last active February 9, 2022 20:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save woochica/a559b0d484ebc6593c3b48b1f491acd7 to your computer and use it in GitHub Desktop.
Save woochica/a559b0d484ebc6593c3b48b1f491acd7 to your computer and use it in GitHub Desktop.
Add logging to Django management commands
import logging
from django.core.management.base import BaseCommand
VERBOSITY_ERROR = 0
VERBOSITY_WARNING = 1
VERBOSITY_NOTICE = 2
VERBOSITY_SUCCESS = 3
LEVEL_ERROR = "error"
LEVEL_WARNING = "warning"
LEVEL_NOTICE = "notice"
LEVEL_SUCCESS = "success"
DEFAULT_VERBOSITY = VERBOSITY_ERROR
class LoggingBaseCommand(BaseCommand):
"""Base class for management commands.
Log all messages to the module logger.
Send messages to the stdout/stderr according to the verbosity option.
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._logger = logging.getLogger(self.__module__)
self._verbosity = DEFAULT_VERBOSITY
def handle(self, *args, **options):
self._verbosity = options.get("verbosity", DEFAULT_VERBOSITY)
def _send_to_log(self, message: str, level: str) -> None:
"""Send message to the defult log file."""
if level == LEVEL_SUCCESS:
self._logger.info(message)
elif level == LEVEL_WARNING:
self._logger.warning(message)
elif level == LEVEL_NOTICE:
self._logger.debug(message)
elif level == LEVEL_ERROR:
self._logger.error(message)
def _send_to_console(self, message: str, level: str):
"""Print message to stdout/stderr according to the option `verbosity`."""
if level == LEVEL_SUCCESS and self._verbosity >= VERBOSITY_SUCCESS:
self.stdout.write(self.style.SUCCESS(message))
elif level == LEVEL_WARNING and self._verbosity >= VERBOSITY_WARNING:
self.stdout.write(self.style.WARNING(message))
elif level == LEVEL_NOTICE and self._verbosity >= VERBOSITY_NOTICE:
self.stdout.write(self.style.NOTICE(message))
elif level == LEVEL_ERROR:
self.stderr.write(self.style.ERROR(message))
def log(self, message: str, level: str = LEVEL_SUCCESS) -> None:
"""Print the message with the given level to stdout/stderr."""
if level not in (LEVEL_ERROR, LEVEL_WARNING, LEVEL_NOTICE, LEVEL_SUCCESS):
raise ValueError(f"Unknown log level: {level}")
self._send_to_log(message, level)
self._send_to_console(message, level)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment