2017-01-23 73 views
1

我希望登錄到文件以及在終端窗口中顯示相同的信息,但顏色很好(使用colorlog或其他跨平臺日誌着色器)。這是我有:如何使用一個格式化程序記錄和使用彩色格式化程序到終端?

import logging 
import os 

import colorlog 


def logger(log_filepath='my_app.log', logger_name='myAppLogger'): 
    """Log plain text to file and to terminal with colors""" 

    logger = logging.getLogger(logger_name) 

    # Log to file (but not to terminal) 
    logfile_handler = logging.FileHandler(log_filepath) 
    plain_formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
    logfile_handler.setFormatter(plain_formatter) 
    logfile_handler.setLevel(logging.DEBUG) 

    # Logging info level to stdout with colors 
    terminal_handler = colorlog.StreamHandler() 
    color_formatter = colorlog.ColoredFormatter(
     "%(log_color)s%(levelname)-8s%(reset)s %(asctime)s %(blue)s%(message)s", 
     datefmt=None, 
     reset=True, 
     log_colors={ 
      'DEBUG': 'cyan', 
      'INFO':  'green', 
      'WARNING': 'yellow', 
      'ERROR': 'red', 
      'CRITICAL': 'red,bg_white', 
     }, 
     secondary_log_colors={}, 
     style='%' 
    ) 
    terminal_handler.setLevel(logging.DEBUG) 
    terminal_handler.setFormatter(color_formatter) 

    # Add handlers to logger 
    logger.addHandler(logfile_handler) 
    logger.addHandler(terminal_handler) 

    return logger 


my_logger = logger() 

my_logger.debug('Testing debug') 
my_logger.info('Testing info') 
my_logger.warning('Testing warning') 
my_logger.error('Testing error') 
my_logger.critical('Testing critical') 

這使我在終端下面的(顏色):

WARNING 2017-01-23 20:30:55,180 Testing warning 
ERROR 2017-01-23 20:30:55,180 Testing error 
CRITICAL 2017-01-23 20:30:55,181 Testing critical 

...這在日誌文件中(沒有顏色,只是純文本) :

2017-01-23 20:30:55,180 WARNING Testing warning 
2017-01-23 20:30:55,180 ERROR Testing error 
2017-01-23 20:30:55,181 CRITICAL Testing critical 

爲什麼級別不正確?

+0

爲什麼'logfile_handler'使用'color_formatter'而不是'terminal_handler'? – Tagc

+0

謝謝 - 就是這樣。但關卡的水平呢? (更新了問題) – fredrik

+0

至於關卡,你需要設置'logger.setLevel(logging.DEBUG)'而不是'terminal_handler.setLevel ...'。我有一個想法,爲什麼這可能是這種情況,但我會確認,然後作爲答案張貼。 – Tagc

回答

1

您的(原始)代碼有兩個問題。第一個是一個小錯誤,其中您將color_formatter分配給日誌處理程序而不是終端處理程序。

的第二個問題 - 你沒有看到下面在終端WARNING級別的日誌 - 由事實,你是在終端處理但不是記錄器本身設置最小日誌記錄級別造成的。您需要替換:

terminal_handler.setLevel(logging.DEBUG) 

有了:默認情況下

logger.setLevel(logging.DEBUG) 

the documentation,記錄器被設置爲WARNING日誌級別,如果我的直覺是正確的,那麼僅設置處理程序,以較低的日誌級別不起作用,因爲處理程序只能處理記錄程序提供的內容 - WARNING - 級別日誌及更高級別。