首页 > 编程语言 >python logging模块

python logging模块

时间:2022-09-18 22:57:36浏览次数:86  
标签:__ logging log level python handler 模块 logger

logging模块处理流程:

image

分为几个模块:

  • logger: 最高层模块,用来输出log
    • logger.level来筛选log
    • logger.debug()/info()/warning()/error()等输出log
  • handler: 经过logger过滤后log会分发给所有handler处理。每个handler有自己的level, formatter, 以及输出流
    • handler.level 过滤log
    • handler.formatter 决定log输出的样式

StreamHandler: 常见的StreamHandler输出到标准流,FileHandler,输出到文件

level的排序:NOTSET < DEBUG < INFO < WARNING < ERROR

只有大于level的才会被处理

注意:一条log会经历两次过滤,一次是logger.level,一次是handler.level,被前者过滤掉的log不会进入handler处理流程。handler的level和logger的level没有什么必然关系。

e.g. 1. 最基本的使用方法:

import logging
logging.info('这条不会输出,因为默认level是WARNING')
logging.warning('这条会输出')

默认会输出到stderr

e.g. 2. 带自定义输出的基本使用方法:

import logging, sys
if __name__ == '__main__':
	logger = logging.getLogger(__name__)
	logging.basicConfig(
        format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
        datefmt="%m/%d/%Y %H:%M:%S",
        handlers=[logging.StreamHandler(sys.stdout), logging.FileHandler('output.log')],
    )
	logger.setLevel(logging.INFO)

	logger.info('hello world')

输出如下:

09/18/2022 21:50:53 - INFO - __main__ - hello world

同时会输出到文件output.log

一些重要的默认值

  • 默认有一个root logger,是自己定义的logger的parent
  • root的level默认是WARNING,无handler
  • logger 所有parent直到root都没有handler时使用一个默认的全局handler,该handler的level是WARNING,输出到stderr
  • 如果logger没定义level,会使用第一个找到的parent的非0(NOTSET)的level,一般是root的level (WARNING),如果所有parent都没有level,则使用NOTSET(最低级)
  • basicConfig函数配置root logger的一些属性,如果root有handler,则basicConfig不起作用
  • 手动创建的handler默认level是NOTSET,手动创建的logger默认level也是NOTSET,但是如果parent有非NOTSET的level,则优先使用parent的level(比如root的WARNING)

上文的e.g.2就是给root handler配置了两个handler,一个输出到stdout,一个输出到文件, 两个共用一个formatter,自己定义的logger是没有handler的,最终递归地使用了root的handler

e.g.3 INFO和WARNING分开输出到不同的地方

import logging
from sys import stdout, stderr
if __name__ == "__main__":
	format="%(asctime)s - %(levelname)s - %(name)s - %(message)s"
    datefmt="%m/%d/%Y %H:%M:%S"
    formatter = logging.Formatter(format, datefmt, '%')

    # logger to stdout
    logger  = logging.getLogger(__name__)
    # 不能设置成NOTSET,不然优先使用root的level,即warning
    logger.setLevel(logging.DEBUG)
    hdlr = logging.StreamHandler(stdout)
    hdlr.setFormatter(formatter)
    logger.addHandler(hdlr)

    # logger to stderr
    err = logging.getLogger(__name__ + 'err')
    err.setLevel(logging.WARNING)
    hdlr = logging.StreamHandler(stderr)
    hdlr.setFormatter(formatter)
    err.addHandler(hdlr)

标签:__,logging,log,level,python,handler,模块,logger
From: https://www.cnblogs.com/wangbingbing/p/16706005.html

相关文章

  • python-装饰器
    装饰器什么是装饰器?装饰器本质上是一个Python函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。装饰器......
  • django中的auth模块与admin后台管理
    1.auth模块在创建完django项目之后,执行数据库迁移之后,数据库里会增加很多新表,其中有一张名为auth_user的表,当访问django自带的路由admin的时候,需要输入用户名和密码,其参......
  • python爬虫入门笔记(随便记记,持续更新)
    准备:安装库pip3installbeautifulsoup4apt-getinstallpython-lxmlpip3installparse 一、获得从baidu.com中能够跳转到的页面(的链接)importrequests......
  • Python 类
    Class对象类对象支持两种操作:属性引用和实例化。实例对象实例对象有两种有效的属性名称:数据属性和方法。数据属性,不需要声明,像局部变量一样,将在第一次被赋值时产生方......
  • Python面向对象+unittest框架(存档)
    面向对象基本的介绍面向对象是一个编程思想(写代码的套路)编程思想:1.面向过程2.面向对象以上两种都属于写代码的套路(方法),最终目的都是为了将代码书写出来,只不过过......
  • python实训2
    test3-1print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n")number=int(input("请输入您认为符合条件的数:"))ifnumber%3==2andnumber%5==3andnumb......
  • 低代码平台前端的设计与实现(一)渲染模块的基本实现
    这两年低代码平台的话题愈来愈火,一眼望去全是关于低代码开发的概念,鲜有关于低代码平台的设计实现。本文将以实际的代码入手,逐步介绍如何打造一款低开的平台。低开概念我们......
  • 【利用Python进行edf格式的肌电处理的一些过程记录】-2022/09
    (1)获取原肌电数据,生成图片1.使用的库:mne2.肌电数据的格式:edfdefShow_Information(file):raw=read_raw_edf(file,preload=True)info=raw.info......
  • MySQL的日志模块
    一、redologMySQL里经常说到的WAL技术,WAL的全称是Write-AheadLogging,它的关键点就是先写日志,再写磁盘。(“先写日志”也是先写磁盘,只是写日志是顺序写盘,速度很快......
  • python实验报告(第三周)
    实验3:流程控制语句一、实验目的和要求1、了解Python的程序结构形式和嵌套语句的格式;2、掌握if、if…else、if…elif…else选择语句的使用;3、掌握条件表达式和while、fo......