python之logging模塊:將不同的日誌寫入到不同的文件

import logging.config
from logging import LogRecord


# 通常用於Linux系統下,使控制檯輸出的日誌帶顏色
class ColorFormatter(logging.Formatter):
    log_colors = {
        'CRITICAL': '\033[0;31m',
        'ERROR': '\033[0;33m',
        'WARNING': '\033[0;35m',
        'INFO': '\033[0;32m',
        'DEBUG': '\033[0;00m',
    }

    def format(self, record: LogRecord) -> str:
        s = super().format(record)

        level_name = record.levelname
        if level_name in self.log_colors:
            return self.log_colors[level_name] + s + '\033[0m'
        return s


class MyFilter400(logging.Filter):
    def filter(self, record: LogRecord):
        if record.msg.startswith("4"):
            return True
        return False


class MyFilter300(logging.Filter):
    def filter(self, record: LogRecord):
        if record.msg.startswith("3"):
            return True
        return False


LOG_LEVEL = logging.INFO

LOGGER = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'color': {
            'class': '__main__.ColorFormatter',  # 如果你的模塊不是寫在啓動程序中,請將__main__更換成你模塊的路徑,下同
            'format': '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
        },
        'default': {
            'class': 'logging.Formatter',
            'format': '%(message)s'
        }
    },
    'filters': {
        'filter_400': {
            '()': '__main__.MyFilter400'
        },
        'filter_300': {
            '()': '__main__.MyFilter300'
        }
    },
    'handlers': {
        'console': {
            'level': LOG_LEVEL,
            'class': 'logging.StreamHandler',
            'formatter': 'color',
        },
        'file1': {
            'level': LOG_LEVEL,
            'class': 'logging.FileHandler',
            'mode': 'w',
            'formatter': 'default',
            'filename': '400_log.txt',
            'encoding': 'utf-8',
            'filters': ['filter_400']
        },
        'file2': {
            'level': LOG_LEVEL,
            'class': 'logging.FileHandler',
            'mode': 'w',
            'formatter': 'default',
            'filename': '300_log.txt',
            'encoding': 'utf-8',
            'filters': ['filter_300']
        },
    },
    'loggers': {
        '__main__': {
            'handlers': ['file1', 'file2', 'console'],
            'level': LOG_LEVEL,
        },
    }
}

logging.config.dictConfig(LOGGER)

logger = logging.getLogger(__name__)

logger.debug('200,this is a logger debug message')
logger.info('302,this is a logger info message')
logger.warning('301,this is a logger warning message')
logger.error('404,this is a logger error message')
logger.critical('500,this is a logger critical message')

print("%s" % __name__)

運行效果圖:
控制檯:
在這裏插入圖片描述
文件:
3開頭的寫入到300_log.txt
4開頭的寫入到400_log.txt

特別注意,使用過濾器的一個問題

class MyFilter400And500(logging.Filter):
    def filter(self, record: LogRecord):
        if record.msg.startswith("4") or record.msg.startswith("5"):
            return True
        return False

# record.msg = "404, %s, %s" 
logger.info(f"{status_code}, %s, %s", website, link)

# record.msg = "%s, %s, %s",這就導致過濾器返回False
logger.info("%s, %s, %s", status_code, website, link)

因此,如果發現消息沒有寫入文件,可能是消息格式的問題。
目前,官方推薦字符串格式化的方式就是第一種方式,%s.format()的方式都不如這個好。

發佈了23 篇原創文章 · 獲贊 28 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章