了解了四大组件的基本定义之后,我们通过图示的方式来理解下信息的传递过程:

也就是获取的日志信息,进入到Logger日志器中,传递给处理器确定要输出到哪里,然后进行过滤器筛选,通过后再按照定义的格式进行日志的输出。

描述上面这个图的日志流处理流程:
logger.info(…),logger.debug(…)等;LogRecord类)对象;Stream等);logger。propagate属性值为1,则表示日志消息将会被输出到处理器指定的位置,同时还会被传递给parent日志器的handlers进行处理,直到当前日志器的propagate属性为0停止,如果propagate值为0则表示不向parent日志器的handlers传递该消息,到此结束。可见,一条日志信息要想被最终输出需要依次经过以下几次过滤:
(1)需求:
all.log文件中记录所有的日志信息,日志格式为:日期和时间 - 日志级别 - 日志信息。error.log文件中单独记录error及以上级别的日志信息,日志格式为:日期和时间 - 日志级别 - 文件名[:行号] - 日志信息。all.log在每天凌晨进行日志切割。(2)分析:
level需要设置为最低级别DEBUG;handler;handler都是与FileHandler相关的;all.log要求按照时间进行日志切割,因此他需要用logging.handlers.TimedRotatingFileHandler类;error.log没有要求日志切割,因此可以使用FileHandler类;handler分别设置格式器;(3)示例
# 导入logging模块import loggingimport logging.handlers# 或者 from logging.handlers import TimedRotatingFileHandlerimport datetime# 创建一个日志器,就是一个logger对象logger = logging.getLogger('logger')# 设置logger日志级别logger.setLevel(logging.DEBUG)# 定义处理器1# 这里进行简化# rf_handler = logging.handlers.TimedRotatingFileHandler('all.log', when='midnight', interval=1, backupCount=7,# atTime=datetime.time(0, 0, 0, 0))"""`TimedRotatingFileHandler`位于`logging.handlers`模块中, 支持按一定时间间隔更换磁盘日志文件。这样就可以保证日志单个文件不会太大。可以根据官方文档自己学习:https://docs.python.org/zh-cn/3/library/logging.handlers.html"""all_handler = logging.FileHandler('../log/all.log', encoding="utf-8")# 给处理器传入格式器all_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))# 定义处理器2error_handler = logging.FileHandler('../log/error.log', encoding="utf-8")# 设置处理器日志级别error_handler.setLevel(logging.ERROR)# 给处理器传入格式器error_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))# 把两个处理器添加到日志器中logger.addHandler(all_handler)logger.addHandler(error_handler)logger.debug('debug message')logger.info('info message')logger.warning('warning message')logger.error('error message')logger.critical('critical message')执行结果:
all.log文件输出。
2021-01-15 23:12:27,197 - DEBUG - debug message2021-01-15 23:12:27,198 - INFO - info message2021-01-15 23:12:27,198 - WARNING - warning message2021-01-15 23:12:27,198 - ERROR - error message2021-01-15 23:12:27,198 - CRITICAL - critical messageerror.log文件输出。
2021-01-15 23:12:27,198 - ERROR - demo_log3.py[:35] - error message2021-01-15 23:12:27,198 - CRITICAL - demo_log3.py[:36] - critical message参考:https://blog.csdn.net/mk1843109092/article/details/97104041