प्रतिक्रियाओं के टन हैं। लेकिन डेकोरेटर के बारे में कोई बात नहीं कर रहा है। तो यहाँ मेरा है।
क्योंकि यह बहुत अधिक सरल है।
कुछ भी आयात करने की आवश्यकता नहीं है, न ही कोई उपवर्ग लिखने के लिए:
#!/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)