python中logging库的使用总结


Posted in Python onOctober 18, 2017

前言

最近因为工作的需要,在写一些python脚本,总是使用print来打印信息感觉很low,所以抽空研究了一下python的logging库,来优雅的来打印和记录日志,下面话不多说了,来一起看看详细的介绍吧。

一、简单的将日志打印到屏幕:

import logging

logging.debug('This is debug message') #debug
logging.info('This is info message')  #info
logging.warning('This is warning message') #warn

屏幕上打印:WARNING:root:This is warning message

默认情况下,会打印WARNING级别的日志

  • DEBUG:详细信息,调试信息。
  • INFO:确认一切按预期运行。
  • WARNING:表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了')。软件还是在正常工作。
  • ERROR:由于更严重的问题,软件已不能执行一些功能了。
  • CRITICAL:严重错误,表明软件已不能继续运行了。

二、通过basicConfig函数来对日志的输入格式和方法进行配置

import logging

logging.basicConfig(level=logging.DEBUG,
  format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
  datefmt='%Y-%m-%d %a %H:%M:%S',
  filename='test.log',
  filemode='w')
 
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

以上代码不会在屏幕上打印日志,而是会在当前目录生成test.log的日志文件,日志被打印在日志文件中:

2017-10-16 Mon 10:05:17 testlogging.py[line:25] DEBUG This is debug message

2017-10-16 Mon 10:05:17 testlogging.py[line:26] INFO This is info message

2017-10-16 Mon 10:05:17 testlogging.py[line:27] WARNING This is warning message

  • logging.basicConfig函数各参数:
  • filename: 指定日志文件名
  • filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
  • format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
 %(levelname)s: 打印日志级别名称
 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
 %(filename)s: 打印当前执行程序名
 %(funcName)s: 打印日志的当前函数
 %(lineno)d: 打印日志的当前行号
 %(asctime)s: 打印日志的时间
 %(thread)d: 打印线程ID
 %(threadName)s: 打印线程名称
 %(process)d: 打印进程ID
 %(message)s: 打印日志信息
  • datefmt: 指定时间格式,同time.strftime()
  • level: 设置日志级别,默认为logging.WARNING
  • stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

三、同时将日志输出到屏幕和日志文件

#定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)

插入以上代码就可以同时在屏幕上打印出日志

屏幕上打印:

root : INFO This is info message

root : WARNING This is warning message

文件中打印:

2017-10-16 Mon 10:20:07 testlogging.py[line:46] DEBUG This is debug message

2017-10-16 Mon 10:20:07 testlogging.py[line:47] INFO This is info message

2017-10-16 Mon 10:20:07 testlogging.py[line:48] WARNING This is warning message

四、通过配置文件配置日志

#logger.conf
[loggers]
#定义logger模块,root是父类,必需存在的,其它的是自定义。 
keys=root,infoLogger,warnlogger

[logger_root] 
level=DEBUG    #level 级别,级别有DEBUG、INFO、WARNING、ERROR、CRITICAL
handlers=infohandler,warnhandler #handlers 处理类,可以有多个,用逗号分开

[logger_infoLogger]   #[logger_xxxx] logger_模块名称
handlers=infohandler
qualname=infoLogger   #qualname logger名称,应用程序通过 logging.getLogger获取。对于不能获取的名称,则记录到root模块。
propagate=0    #propagate 是否继承父类的log信息,0:否 1:是

[logger_warnlogger]
handlers=warnhandler
qualname=warnlogger
propagate=0

###############################################
#定义handler
[handlers]
keys=infohandler,warnhandler

[handler_infohandler]
class=StreamHandler   #class handler类名
level=INFO    #level 日志级别
formatter=form02   #formatter,下面定义的formatter
args=(sys.stdout,)   #args handler初始化函数参数

[handler_warnhandler]
class=FileHandler
level=WARN
formatter=form01
args=('logs/deploylog.log', 'a')

###############################################
# 定义格式化输出
[formatters]
keys=form01,form02

[formatter_form01]
format=%(message)s %(asctime)s
datefmt=%Y-%m-%d %H:%M:%S

[formatter_form02]
format=%(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S

日志格式

  • %(asctime)s 年-月-日 时-分-秒,毫秒 2013-04-26 20:10:43,745
  • %(filename)s 文件名,不含目录
  • %(pathname)s 目录名,完整路径
  • %(funcName)s 函数名
  • %(levelname)s 级别名
  • %(lineno)d 行号
  • %(module)s 模块名
  • %(message)s 消息体
  • %(name)s 日志模块名
  • %(process)d 进程id
  • %(processName)s 进程名
  • %(thread)d 线程id
  • %(threadName)s 线程名

测试配置文件

from logging.config import fileConfig

fileConfig('logger.conf')
logger=logging.getLogger('infoLogger')
logger.info('test1')
logger_error=logging.getLogger('warnhandler')
logger_error.warn('test5')

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
使用Python脚本对Linux服务器进行监控的教程
Apr 02 Python
python基础教程之匿名函数lambda
Jan 17 Python
使用python编写监听端
Apr 12 Python
python 限制函数调用次数的实例讲解
Apr 21 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 Python
UI自动化定位常用实现方法代码示例
Oct 27 Python
python遍历路径破解表单的示例
Nov 21 Python
python代码实现猜拳小游戏
Nov 30 Python
Django开发RESTful API实现增删改查(入门级)
May 10 Python
Python办公自动化之Excel(中)
May 24 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 #Python
Ubuntu安装Jupyter Notebook教程
Oct 18 #Python
python 中的divmod数字处理函数浅析
Oct 17 #Python
Python中的id()函数指的什么
Oct 17 #Python
Python中int()函数的用法浅析
Oct 17 #Python
一文总结学习Python的14张思维导图
Oct 17 #Python
python 中的int()函数怎么用
Oct 17 #Python
You might like
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
Three.js实现浏览器变动时进行自适应的方法
2017/09/26 Javascript
原生js调用json方法总结
2018/02/22 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
简单介绍Python中的len()函数的使用
2015/04/07 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
CLR与IL分别是什么含义
2016/08/23 面试题
高中生学习生活的自我评价
2013/11/27 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
python中os.path.join()函数实例用法
2021/05/26 Python
CSS基础详解
2021/10/16 HTML / CSS
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL