Skip to main content
 首页 » 编程设计

python之Django 根据错误级别记录颜色,没有模块

2024年11月01日34zdz8207

我使用标准 Django logging基于 Python 的内置日志记录模块。我在 settings.py 中的日志记录配置接近于以下内容:

import logging 
 
logger = logging.getLogger(__name__) 
 
LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
        'verbose': { 
            'format': '\x1b[33;21m{levelname} {asctime} {module} {process:d} {thread:d}\x1b[0m: {message}', 
            'style': '{', 
        }, 
    }, 
    'handlers': { 
        'console': { 
            'class': 'logging.StreamHandler', 
            'formatter': 'verbose', 
        }, 
        'sentry': { 
            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler', 
            'tags': {'custom-tag': 'x'}, 
        }, 
    }, 
    'loggers': { 
        '': { 
            'handlers': ['console', 'sentry'], 
            'level': 'DEBUG' if DEBUG else 'WARNING', 
            'propagate': True, 
        }, 
    }, 
} 

我想知道是否可以根据格式中的 levelname 使用 ansi 颜色(在本例中为 \x1b[33;21m),而无需安装其他模块,如 colorlog。

请您参考如下方法:

可以通过子类化 logging.Formatter 并通过查看 LogRecord 对象根据级别更改格式来做到这一点。以下代码以红色记录错误,以绿色记录其他所有内容。这只是一个非常基本的示例,旨在让您了解其工作原理。

import logging 
 
class LevelFormatter(logging.Formatter): 
 
    def _set_format(self, fmt, style='%'): 
         self._style = logging._STYLES[style][0](fmt) 
         self._fmt = self._style._fmt 
 
    def format(self, record): 
        if record.levelno == logging.ERROR: 
            self._set_format('\x1b[31;21m %(levelname)s \x1b[0m - %(message)s') 
        else: 
            self._set_format('\x1b[32;21m %(levelname)s \x1b[0m - %(message)s') 
        return super().format(record) 
 
fmt = LevelFormatter() 
 
logger = logging.getLogger() 
handler = logging.StreamHandler() 
handler.setFormatter(fmt) 
logger.addHandler(handler) 
 
logger.error('error') # appears in red 
logger.warning('warn') # appears in green