python日志模块笔记
前言
在应用中记录日志是程序开发的重要一环,也是调试的重要工具。但却很容易让人忽略。之前用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日志模块笔记的更多相关文章
- python日志模块logging
python日志模块logging 1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...
- python日志模块
许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系 统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4c ...
- Python 日志模块实例
python 打印对象的所有属性值: def prn_obj(obj): print '\n'.join(['%s:%s' % item for item in obj.__dict__.it ...
- Python日志模块logging用法
1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 ...
- python日志模块的使用
学习一下python的日志模块logging,可以参考如下博客,写得很详细 https://www.cnblogs.com/yyds/p/6901864.html https://www.cnblog ...
- python日志模块logging学习
介绍 Python本身带有logging模块,其默认支持直接输出到控制台(屏幕),或者通过配置输出到文件中.同时支持TCP.HTTP.GET/POST.SMTP.Socket等协议,将日志信息发送到网 ...
- Python 日志模块详解
前言 我们知道查看日志是开发人员日常获取信息.排查异常.发现问题的最好途径,日志记录中通常会标记有异常产生的原因.发生时间.具体错误行数等信息,这极大的节省了我们的排查时间,无形中提高了编码效率.所以 ...
- Python日志模块的管理(二)
日志模块可以通过封装一个类,也可以通过配置文件取管理 新建1个log.ini文件 [loggers] keys=root [handlers] keys=fileHandler,streamHandl ...
- Python 日志模块 logging通过配置文件方式使用
vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...
随机推荐
- Visual Studio 2010安装包
点击下载
- 为 Ubuntu/Anaconda/pip 添加国内下载源
背景 正在看 tensorflow-lite 压缩模型的部分,结果 tutorial 一上来就要卸旧版安装 tf-nightly (新版?反正小白下就vans了) 然而好不容易才编译好源码舍不得删.又 ...
- kaldi学习 - 一脚本流学习工具使用
目录 yesno训练 先给出整体脚本如下: 分块详解 建立解码脚本 kaldi中脚本东西比较多,一层嵌一层,不易阅读. 本文以yesno为例,直接使用kaldi编译的工具,书写简易训练步骤,方便学习k ...
- cocos2d-x环境搭建 摘自百度文库
cocos2d-x环境搭建 引言:笔者在网上寻觅了很多资料,最终发现了这份实际可用的文档,供大家参考.源地址:http://wenku.baidu.com/view/93f7b0f1102de2bd9 ...
- MAC下Python3.5安装问题
mac中自动集成了python2.7,但是作为程序员总是希望用最新的版本, 刚才安装python3.5后,python -V,依然提示是,2.7: 然后在 .bash_profile后面找到pytho ...
- 【linux】亲测成功_CentOS7.2/rhel7.2 忘记root密码及重置root密码的方法?
本文转自:https://www.jb51.net/article/146320.htm CentOS 7 root密码的重置方式和CentOS 6完全不一样,以进入单用户模式修改root密码为例. ...
- Redis--各个数据类型最大存储量
原文地址:https://redis.io/topics/data-types Strings类型:一个String类型的value最大可以存储512M Lists类型:list的元素个数最多为2^3 ...
- 使用window.getSelection()获取div中选中文字内容及位置
div添加一个弹出事件: $(document).ready(function () { $("#marked-area").mouseup(function (e) { $sco ...
- 文件系统中 atime,lazytime,relatime 详聊
atime,ctime,mtime是文件inode的三个时间戳,分别表示文件最近一次的访问时间:inode本身的更改(changed)时间:文件数据的更改(modify)时间:这几个概念还是很好区分. ...
- Hibernate常用方法之_查询
1.使用session的get方法 public User getUser(int id){ Session session = null; User user = null; try { sessi ...