【Python日志输出】控制台输出INFO和WARNING级别,文件只记录WARNING级别

参考博客 - Python日志分级别输出到不同文件

参考思路:为logger设置2个handler,再对2个handler设置不同的filter进行日志过滤。
通过supervisor管理项目时,会有stdout和stderr两种日志路径的设置方式,通过给一个logger设置2个StreamHandler后,分别对handler设置日志级别的过滤,实现日志的分级输出。

# -*- coding: utf-8 -*-
import logging
import logging.handlers
import os


def setup_logger(logger_name):
    # root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
    root_path = os.path.abspath(os.path.join(os.getcwd(), "../.."))  # 与项目根目录平级
    log_path = root_path + '/logs/' + logger_name + '.log'
    myapp = logging.getLogger(logger_name)
    myapp.setLevel(logging.INFO)  # 先将INFO及以上的日志都添加到logger,再按照是否WARNING过滤是否输出到文件

    formatter = logging.Formatter("%(asctime)s - %(filename)s - %(funcName)s[line:%(lineno)d] - %(levelname)s: %(message)s")

    rotatingHandler = logging.handlers.RotatingFileHandler(log_path, maxBytes=20 * 1024 * 1024, backupCount=10)
    rotatingHandler.setFormatter(formatter)
    myapp.addHandler(rotatingHandler)

    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(formatter)
    myapp.addHandler(streamHandler)

    # 过滤级别:控制台输出INFO和WARNING级别,文件只记录WARNING级别
    info_filter = logging.Filter()
    info_filter.filter = lambda record: record.levelno < logging.WARNING  # 设置过滤等级
    err_filter = logging.Filter()
    err_filter.filter = lambda record: record.levelno >= logging.WARNING

    # streamHandler.addFilter(info_filter)
    rotatingHandler.addFilter(err_filter)


# 示例
def main():
    # setup_logger('log1', r'log1.log')
    # setup_logger('log2', r'log2.log')
    # log1 = logging.getLogger('log1')
    setup_logger('myapp')
    myapp = logging.getLogger('myapp')

    myapp.info("file test")
    myapp.warning("file warning")


if __name__ == '__main__':
    main()
    # print(os.path.abspath(os.path.join(os.getcwd(), "../..")))

效果

控制台输出INFO和WARNING级别,文件只记录WARNING级别
在这里插入图片描述
在这里插入图片描述

发布了610 篇原创文章 · 获赞 232 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/104411236