많은 반응이 있습니다. 그러나 아무도 데코레이터에 대해 이야기하고 있지 않습니다. 여기 내 것이 있습니다.
훨씬 더 단순하기 때문입니다.
아무것도 가져 오거나 서브 클래스를 작성할 필요가 없습니다.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
NO_COLOR = "\33[m"
RED, GREEN, ORANGE, BLUE, PURPLE, LBLUE, GREY = \
map("\33[%dm".__mod__, range(31, 38))
logging.basicConfig(format="%(message)s", level=logging.DEBUG)
logger = logging.getLogger(__name__)
# the decorator to apply on the logger methods info, warn, ...
def add_color(logger_method, color):
def wrapper(message, *args, **kwargs):
return logger_method(
# the coloring is applied here.
color+message+NO_COLOR,
*args, **kwargs
)
return wrapper
for level, color in zip((
"info", "warn", "error", "debug"), (
GREEN, ORANGE, RED, BLUE
)):
setattr(logger, level, add_color(getattr(logger, level), color))
# this is displayed in red.
logger.error("Launching %s." % __file__)
이렇게하면 오류가 빨간색으로 설정되고 디버그 메시지가 파란색으로 설정됩니다. 질문 에서처럼.
래퍼를 color
사용하여 메시지의 색상을 동적으로 설정 하는 인수를 취할 수도 있습니다.logger.debug("message", color=GREY)
편집 : 다음은 런타임에 색상을 설정하기 위해 적용된 데코레이터입니다.
def add_color(logger_method, _color):
def wrapper(message, *args, **kwargs):
color = kwargs.pop("color", _color)
if isinstance(color, int):
color = "\33[%dm" % color
return logger_method(
# the coloring is applied here.
color+message+NO_COLOR,
*args, **kwargs
)
return wrapper
# blah blah, apply the decorator...
# this is displayed in red.
logger.error("Launching %s." % __file__)
# this is displayed in blue
logger.error("Launching %s." % __file__, color=34)
# and this, in grey
logger.error("Launching %s." % __file__, color=GREY)