Last active
February 9, 2022 20:07
-
-
Save woochica/a559b0d484ebc6593c3b48b1f491acd7 to your computer and use it in GitHub Desktop.
Add logging to Django management commands
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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