-
Notifications
You must be signed in to change notification settings - Fork 73
控制台日志按日志级别区分颜色 #80
Copy link
Copy link
Closed
Description
稍微修改下代码可以恢复正常显示
# server/logging.py
class ColorHandler(logging.StreamHandler):
WHITE = "0"
RED = "31"
GREEN = "32"
YELLOW = "33"
BLUE = "34"
PURPLE = "35"
def emit(self, record):
try:
msg = self.format(record)
level_color_map = {
logging.DEBUG: self.BLUE,
logging.INFO: self.GREEN,
logging.WARNING: self.YELLOW,
logging.ERROR: self.RED,
logging.CRITICAL: self.PURPLE
}
csi = f"{chr(27)}[" # 控制序列引入符
color = level_color_map.get(record.levelno, self.WHITE)
self.stream.write(f"{csi}{color}m{msg}{csi}m\n")
self.flush()
except RecursionError:
raise
except Exception:
self.handleError(record)对应修改console的输出为server.logging.ColorHandler
# server/settings/logging.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'()': 'server.logging.ServerFormatter',
'format': '%(asctime)s.%(msecs)03d [%(levelname)s] [%(requestUser)s] [%(requestUuid)s][%(pathname)s:%(lineno)d] %(process)d %(thread)d %(message)s'
},
'main': {
'()': 'server.logging.ServerFormatter',
'datefmt': '%Y-%m-%d %H:%M:%S',
'format': '%(asctime)s.%(msecs)03d [%(levelname)s] [%(requestUser)s] [%(requestUuid)s] [%(name)s.%(funcName)s:%(lineno)d] %(message)s',
},
'exception': {
'()': 'server.logging.ServerFormatter',
'datefmt': '%Y-%m-%d %H:%M:%S',
'format': '\n%(asctime)s.%(msecs)03d [%(levelname)s %(requestUser)s] [%(requestUuid)s] %(message)s',
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console': {
'level': 'DEBUG',
'class': 'server.logging.ColorHandler',
'formatter': 'main'
},
'server': {
'encoding': 'utf8',
'level': 'DEBUG',
'class': 'server.logging.DailyTimedRotatingFileHandler',
'when': 'midnight',
'formatter': 'main',
'filename': SERVER_LOG_FILE,
},
'drf_exception': {
'encoding': 'utf8',
'level': 'DEBUG',
'class': 'server.logging.DailyTimedRotatingFileHandler',
'when': 'midnight',
'formatter': 'exception',
'filename': DRF_EXCEPTION_LOG_FILE,
},
'unexpected_exception': {
'encoding': 'utf8',
'level': 'DEBUG',
'class': 'server.logging.DailyTimedRotatingFileHandler',
'when': 'midnight',
'formatter': 'exception',
'filename': UNEXPECTED_EXCEPTION_LOG_FILE,
}
},
'loggers': {
# '': { # 默认的logger ,所有日志将会输出到配置的 handlers
# 'handlers': ['server', 'console'],
# 'level': LOG_LEVEL,
# 'propagate': False,
# },
'django': {
'handlers': ['null'],
'propagate': False,
'level': LOG_LEVEL,
},
'django.request': {
'handlers': ['console', 'server'],
'level': LOG_LEVEL,
'propagate': False,
},
'django.server': {
'handlers': ['console', 'server'],
'level': LOG_LEVEL,
'propagate': False,
},
'django.security': {
'handlers': ['console', 'server'],
'level': LOG_LEVEL,
'propagate': False,
},
'xadmin': {
'handlers': ['console', 'server'],
'level': LOG_LEVEL,
},
'drf_exception': {
'handlers': ['console', 'drf_exception'],
'level': LOG_LEVEL,
},
'unexpected_exception': {
'handlers': ['console', 'unexpected_exception'],
'level': LOG_LEVEL,
},
},
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels