今日想在程序中加入更好用的日志功能,利用到了logging模块,直接从网上抄了代码,无奈怎么也输出不了日志
import logging
# 获取一个logger对象
logger = logging.getLogger(__name__)
#logger.setLevel(logging.DEBUG)
# 创建文件和命令行的handler
s_handler = logging.StreamHandler()
f_handler = logging.FileHandler('file.log')
# 分别设置两个handler的日志等级,大于等于这个等级的才输出
f_handler.setLevel(logging.WARNING)
s_handler.setLevel(logging.INFO)
# 设置日志的输出格式并把格式添加到handler中
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
f_handler.setFormatter(formatter)
s_handler.serFormatter(formatter)
# 把handler添加到logger对象中
logger.addHandler(f_handler)
logger.addHandler(s_handler)
# 输出各种等级的日志
logger.debug("debug log")
logger.info('info log')
logger.warning("warning log")
logger.critical("critical log")
但控制台只输出了 warning 和 critical 级别的log而 debug和info都没有输出;
warning log
critical logProcess finished with exit code 0
文件里面同样也是这两条log:
2018-12-28 11:30:27,459 - __main__ - WARNING - warning log 2018-12-28 11:30:27,459 - __main__ - CRITICAL - critical log
原因是使用的logger没有setLevel,采用了默认的level NOTSET,由于logger是NOTSET,所以会查账他的parent的level,为RootLogger的level,默认是warning,所以控制台及file就只输出了warning 及以上级别的log。
而logger的level会影响后续handler的输出:
- 当logger的level大于handler的level,则输出以logger为准
- 当logger的level小于handler的level,则输出以handler为准
所以logger等级应当设备最低的info级别
如有错误,欢迎指正。