SORU
21 Aralık 2008, Pazar


Nasıl renk Python günlük çıkış yapabilir miyim?

Bir süre önce, renkli çıktı, muhtemelen günlük sistem yüzünden bütün mesajları standardize edildi çünkü) ile Mono bir uygulama gördüm.

Şimdi, Python size bir çok seçenek çıktı özelleştirmek için belirlemenizi sağlar logging modülü vardır. Yani, benzer Python ile mümkün olacak bir şey hayal ediyorum, ama bu yere nasıl yapacağımı bulamıyorum.

Python yapmak için herhangi bir yolu logging renk modülü çıkış var mı?

(Örneğin mavi ya da sarı, kırmızı, hata ayıklama iletileri hatalar istiyorum.

Tabii ki bu muhtemelen uyumlu bir terminal (en modern terminalleri) gerektirir; ama ben orijinal geri dönüş olursa renk desteklenmiyor eğer logging çıkış olabilir.

Günlük modülü ile renkli çıktı nasıl alabilirim herhangi bir fikir?

CEVAP
21 Aralık 2008, Pazar


Zaten rengi kaçar, benim bash onları kullandım bir süre önce istemi biliyordu. Yine de teşekkürler.
İstediğimi sonunda çalışır ve hataları birkaç hafta sonra yaptığı günlük modülü ile entegre oldu.
Sonunda:

BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)

#The background is set with 40 plus the number of the color, and the foreground with 30

#These are the sequences need to get colored ouput
RESET_SEQ = "\033[0m"
COLOR_SEQ = "\033[1;%dm"
BOLD_SEQ = "\033[1m"

def formatter_message(message, use_color = True):
    if use_color:
        message = message.replace("$RESET", RESET_SEQ).replace("$BOLD", BOLD_SEQ)
    else:
        message = message.replace("$RESET", "").replace("$BOLD", "")
    return message

COLORS = {
    'WARNING': YELLOW,
    'INFO': WHITE,
    'DEBUG': BLUE,
    'CRITICAL': YELLOW,
    'ERROR': RED
}

class ColoredFormatter(logging.Formatter):
    def __init__(self, msg, use_color = True):
        logging.Formatter.__init__(self, msg)
        self.use_color = use_color

    def format(self, record):
        levelname = record.levelname
        if self.use_color and levelname in COLORS:
            levelname_color = COLOR_SEQ % (30   COLORS[levelname])   levelname   RESET_SEQ
            record.levelname = levelname_color
        return logging.Formatter.format(self, record)

Ve bunu yapmak için, kendi Logger oluşturun:

# Custom logger class with multiple destinations
class ColoredLogger(logging.Logger):
    FORMAT = "[$BOLD%(name)-20s$RESET][%(levelname)-18s]  %(message)s ($BOLD%(filename)s$RESET:%(lineno)d)"
    COLOR_FORMAT = formatter_message(FORMAT, True)
    def __init__(self, name):
        logging.Logger.__init__(self, name, logging.DEBUG)                

        color_formatter = ColoredFormatter(self.COLOR_FORMAT)

        console = logging.StreamHandler()
        console.setFormatter(color_formatter)

        self.addHandler(console)
        return


logging.setLoggerClass(ColoredLogger)

Başkasının ihtiyacı olursa diye.

Eğer birden fazla logger veya işleyicisi kullanıyorsanız dikkatli olun: ColoredFormatter Diğer işleyicileri daha geçti veya diğer kaydediciler için geliştirilen " kayıt nesnesi, değişiyor. Kaydediciler vb dosyasını yapılandırdınız. muhtemelen günlük dosyalarında renkleri var istemiyorum. Önlemek için, en iyisi sadece bir kopyasını oluşturmak record copy.copy() ncesinde bu levelname nitelik veya sıfırlamak levelname önceki değer, daha önce dönen biçimlendirilmiş dize (kredi için Michael yorumlar).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • NightShader1

    NightShader1

    25 Temmuz 2006
  • superemposed

    superemposed

    25 Aralık 2007
  • trickycharms

    trickycharms

    6 Aralık 2013