前言

在应用中记录日志是程序开发的重要一环,也是调试的重要工具。但却很容易让人忽略。之前用flask写的一个服务就因为没有处理好日志的问题导致线上的错误难以察觉,修复错误的定位也很困难。最近恰好有时间可以梳理一下python日志的功能,下面是一点笔记。

使用

python标准库中提供了记录日志的方案。

import logging
from logging.config import dictConfig logger = logging.getLogger(__name__) # 定义格式
formatter = logging.Formatter(fmt='%(asctime)s %(name)-12s %(levelname)-8s %(message)s') # 定义日志处理器
streamHdl = logging.StreamHandler() # 设定日志级别
streamHdl.setLevel(logging.DEBUG) # 设定日志格式
streamHdl.setFormatter(formatter) # 给日志器添加日志处理器
logger.addHandler(streamHdl) # 记录日志
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()

从上面的演示这个模块的使用是比较简单的。但在应用中深入使用有些需要注意的地方:

parent logger / child logger

在多模块程序中使用多个模块是很常见的,被引用模块中的日志对象容易让人迷惑。我们知道一个应用有一个唯一的文件入口,如果这个入口文件中定义了logger,那这个logger就是parent logger, 其中被导入的模块中定义的logger就是child logger, 与我们常见的在一个模块中实例化使用不同,在每一个需要记录日志的地方都需要产生一个logger,然后进行日志记录操作。每个模块内部所记录的日志根据每个logger的配置信息对日志进行操作,然后根据该logger是否反向传递到parent logger进一步操作。反向传递到parent logger之后,依旧像普通的logger一样对日志进行处理。

日志的配置

https://docs.python.org/3/howto/logging.html#configuring-logging

每个logger都可以通过ini文件、yarm文件、对象等形式进行配置,这里主要讲以字典形式进行的配置。


logging_config = dict(
version=1,
formatters={
'f': {'format':
'%(asctime)s000000 %(name)-12s %(levelname)-8s %(message)s'}
},
handlers={
'h': {'class': 'logging.StreamHandler',
'formatter': 'f',
'level': logging.DEBUG}
},
root={
'handlers': ['h'],
'level': logging.DEBUG,
},
)
dictConfig(logging_config)

当在一个文件中使用dictConfig,就给该文件的logger定义了配置。

异常的捕捉

logger.error()与logger.exception()之间的区别在于error()只会打印一句话,而exception()则会将异常的错误栈都会打印出来。对于出现代码异常的地方,可以使用exception()用作记录。

普通日志直接使用logging模块来记录,应用内不处理日志的去向,作为事件流统一输出到标准输出,采用第三方日志采集工具进行捕获和处理。但也不能太绝对,如果外部收集日志的程序缺少对日志级别分类,或者对异常记录缺少必要的支持,就需要内置的模块进行处理。

常用的内置handler

    https://docs.python.org/3/howto/logging.html#useful-handlers

参考

https://12factor.net/logs

https://docs.python.org/3/howto/logging.html

https://docs.python.org/3/howto/logging-cookbook.html

python日志模块笔记的更多相关文章

  1. python日志模块logging

    python日志模块logging   1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...

  2. python日志模块

    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系 统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4c ...

  3. Python 日志模块实例

    python 打印对象的所有属性值: def prn_obj(obj):     print '\n'.join(['%s:%s' % item for item in obj.__dict__.it ...

  4. Python日志模块logging用法

    1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 ...

  5. python日志模块的使用

    学习一下python的日志模块logging,可以参考如下博客,写得很详细 https://www.cnblogs.com/yyds/p/6901864.html https://www.cnblog ...

  6. python日志模块logging学习

    介绍 Python本身带有logging模块,其默认支持直接输出到控制台(屏幕),或者通过配置输出到文件中.同时支持TCP.HTTP.GET/POST.SMTP.Socket等协议,将日志信息发送到网 ...

  7. Python 日志模块详解

    前言 我们知道查看日志是开发人员日常获取信息.排查异常.发现问题的最好途径,日志记录中通常会标记有异常产生的原因.发生时间.具体错误行数等信息,这极大的节省了我们的排查时间,无形中提高了编码效率.所以 ...

  8. Python日志模块的管理(二)

    日志模块可以通过封装一个类,也可以通过配置文件取管理 新建1个log.ini文件 [loggers] keys=root [handlers] keys=fileHandler,streamHandl ...

  9. Python 日志模块 logging通过配置文件方式使用

    vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...

随机推荐

  1. Python 3 学习笔记之——错误和异常

    1. 语法错误 Python 的语法错误被称为解析错,语法分析器会指出出错的代码行,并且在最先找到的错误的位置标记一个小小的箭头. >>> while True File " ...

  2. eclipse mylyn.tasks.ui

    sudo rm workspace/.metadata/.lock ./Applications/eclipse/Eclipse.app/Contents/MacOS/eclipse -clean - ...

  3. lintcode-113-删除排序链表中的重复数字 II

    113-删除排序链表中的重复数字 II 给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素. 样例 给出 1->2->3->3->4->4->5-&g ...

  4. (转)mongdb性能优化收集

    一.数据库最大连接数问题当你在后台日志中,发现大量“connection refused because too many open connections: 819”信息时,一般跟你没有设置合适的最 ...

  5. numEdit

    说明:  利用tedit扩展的数字编辑框,允许设置正负.小数点等(The digital edit box using tedit extended, allowing the set of posi ...

  6. [洛谷P3521][POI2011]ROT-Tree Rotations

    题目大意:给一棵$n(n\leqslant2\times10^5)$个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少.输出最少的逆序对个数 题解:线段树合并,对于每个节点求出交换 ...

  7. React生命周期总结

    React的生命周期总共8个钩子,三个will,两个Did,一个RecciveProps,一个ShouldUpdate,一个render.分为三个阶段,分别是 装载 Mounting更新 Updati ...

  8. phaser常用API总结

    1. 游戏画布的尺寸 var width = game.width, height = game.height;   2. 中心点坐标 var game = new Phaser.Game(...); ...

  9. final变量属性小记

    final 修饰符对于类成员变量来说,具备语法上不可变的特性:对于类成员方法来说,具备语法上子类不可覆盖重写的特性(能被继承的前提下). 但 final 并不限制子类对父类被修饰声明的成员变量进行覆盖 ...

  10. mybatis学习(七)——resultType解析

    resultType是sql映射文件中定义返回值类型,返回值有基本类型,对象类型,List类型,Map类型等.现总结一下再解释 总结: resultType: 1.基本类型  :resultType= ...