关于使用python logging模块的几点总结
使用python的标准日志模块logging可以非常方便地记录日志。Python日志系统非常丰富。添加结构化或非结构化日志输出到python代码,写到文件,输出到控制台,发送到系统日志,或者自定义输出格式都很容易。

下面是我实践过程中遇到的一些经验和教训的总结。

1. 一个简单的日志系统示例
业务场景如下:

开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件

#!/usr/bin/env python
#encoding: utf-8import logging#创建一个logger实例
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)#创建一个handler,用于写入日志文件
fh = logging.FileHandler('simple_log.log')
fh.setLevel(logging.DEBUG)#创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)#定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)#给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)#记录一条日志
logger.info('foobar')

运行后, 在控制台和日志文件都有一条日志:

2. logging模块的API
结合上面的例子,我们说下几个最常使用的API
logging.getLogger([name])
返回一个logger实例,如果没有指定name,返回root logger。
只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例

Logger.setLevel(lvl)
设置logger的level, level有以下几个级别:

NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL

如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级
别的日志都输出
logger.debug("foobar")    # 不输出   
logger.info("foobar")        # 输出  
logger.warning("foobar") # 输出  
logger.error("foobar")      # 输出  
logger.critical("foobar")    # 输出  
 
Logger.addHandler(hdlr)
logger可以雇佣handler来帮它处理日志, handler主要有以下几种:
StreamHandler: 输出到控制台
FileHandler:   输出到文件
handler还可以设置自己的level以及输出格式。

logging.basicConfig([**kwargs])
* 这个函数用来配置root logger, 为root logger创建一个StreamHandler,
   设置默认的格式。
* 这些函数: logging.debug()、logging.info()、logging.warning()、
   logging.error()、logging.critical() 如果调用的时候发现root logger没有任何
   handler, 会自动调用basicConfig添加一个handler
* 如果root logger已有handler, 这个函数不做任何事情

使用basicConfig来配置root logger的输出格式和level:

import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')  

3. 日志对象间的层级结构
除了root logger, 实际上logger实例之间还有父子关系, root logger就是处于最顶层的logger, 它是所有logger的祖先。如下图:

root logger是默认的logger
如果不创建logger实例, 直接调用logging.debug()、logging.info()logging.warning()、logging.error()、logging.critical()这些函数,
那么使用的logger就是 root logger, 它可以自动创建,也是单实例的。

如何得到root logger
通过logging.getLogger()或者logging.getLogger("")得到root logger实例。

默认的level
root logger默认的level是logging.WARNING

如何表示父子关系
logger的name的命名方式可以表示logger之间的父子关系. 比如:
parent_logger = logging.getLogger('foo')

child_logger = logging.getLogger('foo.bar')

什么是effective level

logger有一个概念,叫effective level。 如果一个logger没有显示地设置level,那么它就
用父亲的level。如果父亲也没有显示地设置level, 就用父亲的父亲的level,以此推....
最后到达root logger,一定设置过level。默认为logging.WARNING
child loggers得到消息后,既把消息分发给它的handler处理,也会传递给所有祖先logger处理,

来看一个例子

#!/usr/bin/env python
#encoding: utf-8import logginglogging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')r = logging.getLogger()ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
r.addHandler(ch)p = logging.getLogger('foo')
p.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(message)s')
ch.setFormatter(formatter)
p.addHandler(ch)c = logging.getLogger('foo.bar')
c.debug('foo')

输出如下:

可见,孩子logger没有任何handler,所以对消息不做处理。但是它把消息转发给了它的父亲以及root logger。最后输出四条日志。

参考文献
[1].http://kenby.iteye.com/blog/1162698

关于使用python logging模块的几点总结相关推荐

  1. python logging模块使用

    python logging模块使用 logging模块 日志记录的重要性 在开发过程中,我们可以printf或者Debug来排查问题. 但是在生产环境中(黑盒环境)出现问题,我们并不能知道在运行的环 ...

  2. python logging模块使用_python logging模块使用

    近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- importloggin ...

  3. Python logging模块切分和轮转日志

    Python logging模块切分和轮转日志 logging 模块可以实现日志的输出和写入文件,但实际工作中,对于日志是使用不仅限于输出那么简单. logging基本使用参考:https://blo ...

  4. Python logging模块的基本使用

    Python logging模块的基本使用 logging 模块是 Python 内置的标准模块,用于输出代码日志. 一.logging 模块简介 在工作中,运行的代码量是非常大的,为了更方便的管理代 ...

  5. python调用微信客户端_python模拟微信客户端打开链接Python Logging 模块研究

    背景 在一个新的项目里面加入了日志功能,想自己写一个,但是一个偶然的机会,通过google发现Python内建了一个非常强大的日志(log)模块:logging.粗略的研究了一下,下面是我的一些心得札 ...

  6. python logging模块-写日志、log回滚

    python包/模块,专栏总目录: 1.python自定义模块 2.python模块调用顺序 3.python logging模块 4.python定义跨模块的全局变量 1.logging模块简介 l ...

  7. Python Logging模块实现运行的程序写入 日志

    参考文章:  Python使用logging模块实现打印log到指定文件的方法_python_脚本之家 https://www.jb51.net/article/146909.htm 步骤: (1) ...

  8. python logging模块的作用_Python 日志模块logging分析及使用-2

    本文作为Python日志模块的补充,主要介绍日志回滚RotatingFileHandler和TimedRotatingFileHandler的使用,以及其所带来的问题.Logger对象的日志等级是如何 ...

  9. Python logging模块日志存储位置踩坑

    问题描述 项目过程中写了一个小模块,设计到了日志存储的问题,结果发现了个小问题. 代码结构如下: db.py run.py 其中db.py是操作数据库抽象出来的一个类,run.py是业务逻辑代码.两个 ...

最新文章

  1. spring的事务隔离_再深一点:面试工作两不误,源码级理解Spring事务
  2. Dreamer 3.0 支持json、xml、文件上传
  3. 七个步骤,带你快速读懂 RPC 框架原理
  4. 路由(二)——动态路由简介与RIP协议
  5. DB Intro - MongoDB User
  6. matlab解决无约束优化问题
  7. 51单片机几种精确延时(包含自动适应主时钟)
  8. Nginx页面乱码问题
  9. spring 的web.xml的加载顺序
  10. 悬镜安全宣布完成数千万元Pre-A轮融资
  11. FISCO BCOS区块链搭建说明(第一篇)
  12. THUSC2019:Illusory World
  13. 可以边玩游戏边学编程的手游盘点
  14. 项目敏捷管理模式有哪几种_敏捷团队中有效沟通的5种模式
  15. Office系列---将Office文件(Word、PPT、Excel)转换为PDF文件,提取Office文件(Word、PPT)中的所有图片
  16. ZCMU-1635- 超大型 LED 显示屏
  17. Docker 1.12.1初体验
  18. PTA乙级 1108 String复读机——20分
  19. 光模块中的DDM介绍
  20. iconfont与雪碧图的优缺点

热门文章

  1. 2022-2028年中国新能源环卫车行业深度调研与投资战略规划分析报告
  2. MySQL 学习笔记(17)— SQL 执行顺序
  3. MYSQL 连接数据库命令收藏
  4. GitHub上整理的一些工具【转载】
  5. 不同的source control下配置DiffMerge
  6. ORB_SLAM2概述
  7. 数字通信原理_光纤通信原理是什么 光纤通信应用领域介绍【图文】
  8. h5有缓存css,taro H5配置 cdn css js 缓存 hash 配置
  9. c语言怎样定义函数举例,c语言怎样定义函数?
  10. java fragment_Java Web Fragment在项目中使用方法详解