参考博客 - 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级别