【python logging】自定義日誌過濾器,經過參數控制日誌記錄

 

【需求要點】

當前程序已經實現日誌記錄到 log 文件。新增需求,須要把日誌記錄到文件的同時,經過 syslog 服務記錄到系統日誌中。html

要求經過新增參數的方式實現日誌記錄擴展,不能影響原有日誌記錄。python

若是在某一條日誌記錄處增長參數,則把該日誌記錄到日誌文件和系統日誌兩個位置中。spa

 

【實現方案】

方便調試起見,暫不考慮如何經過 syslog 服務記錄到系統日誌中,而是直接輸出到控制檯。demo 程序以下:debug

#!/bin/python # -*- encoding:utf-8 -*-

import sys import logging class ContextFilter(logging.Filter): """ 這是一個控制日誌記錄的過濾器。 """
    def filter(self, record): try: filter_key = record.TASK except AttributeError: return False if filter_key == "logToConsole": return True else: return False if __name__ == '__main__': # 建立日誌對象
    logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 建立日誌處理器,記錄日誌到文件
    log_path = "./log.log" file_handler = logging.FileHandler(log_path) file_handler.setLevel(logging.INFO) file_fmt = "%(asctime)-15s %(levelname)s [%(filename)s %(lineno)d] %(message)s" file_formatter = logging.Formatter(file_fmt) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) # 添加日誌處理器,輸出日誌到控制檯
    console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.WARN) console_fmt = '%(asctime)-15s [%(TASK)s] %(message)s' console_formatter = logging.Formatter(console_fmt) console_handler.setFormatter(console_formatter) console_filter = ContextFilter() console_handler.addFilter(console_filter) logger.addHandler(console_handler) filter_dict = {'TASK': 'logToConsole'} # 記錄日誌
    logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message1', extra=filter_dict) logger.error('error message2')

 

【參考資料】

https://docs.python.org/3/library/logging.html#module-logging調試

https://docs.python.org/3/howto/logging-cookbook.html#using-filters-to-impart-contextual-information日誌

 

經過 syslog 服務記錄到系統日誌中,參考資料:code

https://docs.python.org/3/library/logging.handlers.html#sysloghandlerorm

相關文章
相關標籤/搜索