python 日志 logging 模块

python 日志 logging 模块

  通过 logging 模块打印日志

前提理解

  logging模块的方式是
  1. logger 记录器 记录日志
  2. handle 处理器,处理记录的日志
  常用的四大组件,logger 日志记录 handle 处理器 filter 过滤器 formatter 格式化。
  日志的处理方式理解是日志先应用logger,然后从logger中进入handle,经过handle处理完成。
  常见handle类型,StreamHandler(日志打印到控制台),FileHandler(日志写入到文件)。
  可有多个logger,每个logger可以有多个handle。

使用方式记录

  

# 导入包
import logging
# 初始化一个logger
# __name__参数在外部调用时自动解析为包名称,即文件名名称.
# 如果以主函数运行自动解析为__main__.
# 可以存在多个logger实例,进而记录不同源头的日志,如logger1,logger2等。
logger = logging.getLogger(__name__)
# 构建控制台处理
console_handler = logging.StreamHandler()
# 构建文件记录处理
# file_handler = logging.FileHandler(filename='log.log', encoding='UTF-8')
# 配置handler,如filter过滤,格式formatter等。
# 配置日志记录的格式
formatter=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s')
# asctime为时间
# name为logger名称,
# 可以在 logger = logging.getLogger(‘logger名称’) 设置
# levelname为日志记录等级
# message为信息
console_handler.setFormatter(formatter)
# 将handle与logger绑定
logger.addHandler(console_handler)
# 配置logger,如日志等级,过滤器等
logger.setLevel(logging.DEBUG)

# 记录信息
logger.debug('--debug--')
logger.info('--info--')

输出

2023-02-03 18:02:39,762 __main__ DEBUG --debug--
2023-02-03 18:02:39,763 __main__ INFO --info--

  另一种方式(不建议)设置全局logging属性,这样会将导入的其他包的日志一起记录。

logging.basicConfig(filename='test.log',level=logging.DEBUG,format='%(asctime)s %(name)s %(levelname)s %(message)s')

其他


  日志记录级别应该共同生效setLevel,如果没有设置logger的日志记录级别,或logger.setLevel(),此时使用python默认级别warning,那么尽管设置了handle的日志记录级别,如console_handler.setLevel(logging.DEBUG),也不能输出DEBUG级别的日志。
  handle可以搭配setFormatter和addFilter函数使用。对不同的日志输出采取不同的操作。如console_handler.addFilter(logging.Filter("abc")),使用handle只输出包含abc包名的信息。
  
  

拓展

参考:
https://blog.csdn.net/weixin_47154909/article/details/106203639

流程描述:
logging流程,摘自
https://zhuanlan.zhihu.com/p/425678081
  判断日志的等级是否大于 Logger 对象的等级,如果大于,则往下执行,否则,流程结束。
  产生日志:第一步,判断是否有异常,如果有,则添加异常信息。 第二步,处理日志记录方法(如 debug,info 等)中的占位符,即一般的字符串格式化处理。
  使用注册到 Logger 对象中的 Filters 进行过滤。如果有多个过滤器,则依次过滤;只要有一个过滤器返回假,则过滤结束,且该日志信息将丢弃,不再处理,而处理流程也至此结束。否则,处理流程往下执行。
  在当前 Logger 对象中查找 Handlers,如果找不到任何 Handler,则往上到该 Logger 对象的父 Logger 中查找;如果找到一个或多个 Handler,则依次用 Handler 来处理日志信息。但在每个 Handler 处理日志信息过程中,会首先判断日志信息的等级是否大于该 Handler 的等级,如果大于,则往下执行(由 Logger 对象进入 Handler 对象中),否则,处理流程结束。
  执行 Handler 对象中的 filter 方法,该方法会依次执行注册到该 Handler 对象中的 Filter。如果有一个 Filter 判断该日志信息为假,则此后的所有 Filter 都不再执行,而直接将该日志信息丢弃,处理流程结束。
  使用 Formatter 类格式化最终的输出结果。 注:Formatter 同上述第 2 步的字符串格式化不同,它会添加额外的信息,比如日志产生的时间,产生日志的源代码所在的源文件的路径等等。
  真正地输出日志信息(到网络,文件,终端,邮件等)。至于输出到哪个目的地,由 Handler 的种类来决定。

posted @ 2023-02-03 17:22  雪夜羽  阅读(97)  评论(0编辑  收藏  举报