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


 

【需求要點】

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

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

如果在某一條日志記錄處增加參數,則把該日志記錄到日志文件和系統日志兩個位置中。

 

【實現方案】

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

#!/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 服務記錄到系統日志中,參考資料:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM