【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级别
在这里插入图片描述
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值