[ Python入门教程 ] Python中日志记录模块logging使用实例
python中的logging模块用于记录日志。用户可以根据程序实现需要自定义日志输出位置、日志级别以及日志格式。
将日志内容输出到屏幕
一个最简单的logging模块使用样例,直接打印显示日志内容到屏幕。
- import logging
- logging.critical("critical log")
- logging.error("error log")
- logging.warning("warning log")
- logging.info("info log")
- logging.debug("debug log")
输出结果如下:
- CRITICAL:root:critical log
- ERROR:root:error log
- WARNING:root:warning log
说明:默认情况下python的logging模块将日志打印到标准输出,并且只显示大于等于warning级别的日志(critical > error > warning > info > debug)。
将日志内容输出到文件
将日志事件记录到文件是一种非常常见的情况,方便出现问题时快速定位问题。在logging模块默认配置条件下,记录日志内容,代码如下:
- import logging
- logging.basicConfig(filename='example.log',level=logging.DEBUG)
- logging.debug('This message should go to the log file')
- logging.info('So should this')
- logging.warning('And this, too')
输出结果如下:
- D:\pycharm\work>type example.log
- DEBUG:root:This message should go to the log file
- INFO:root:So should this
- WARNING:root:And this, too
说明:type为dos窗口下查看文件内容命令。
定制日志内容(日志级别、日志格式)
根据程序运行对日志记录的要求,通常需要自定义日志显示格式、输出位置以及日志显示级别。可以通过logging.basicConfig()定制满足自己要求的日志输出格式。
- import logging
- logging.basicConfig(format='[%(asctime)s %(filename)s line:%(lineno)d] %(levelname)s: %(message)s',
- level=logging.DEBUG, filename="log.txt", filemode="w")
- logging.debug('This message should appear on the console')
- logging.info('So should this')
- logging.warning('And this, too')
输出结果如下:
- D:\pycharm\work>type log.txt
- [2020-02-02 10:31:42,994 json_pro.py line:5] DEBUG: This message should appear on the console
- [2020-02-02 10:31:42,995 json_pro.py line:6] INFO: So should this
- [2020-02-02 10:31:42,995 json_pro.py line:7] WARNING: And this, too
通过修改logging.basicConfig()函数中参数取值来定制日志显示。函数参数定义及含义如下:
filename 指定日志写入文件名。
filemode 文件打开方式,默认值为"a"
format 设置日志显示格式
dateft 设置日期时间格式
level 设置显示日志级别
stream 指定stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件。默认为sys.stderr。
format参数用到的格式化字符串如下:
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(filename)s 调用日志输出函数的模块的文件名
%(levelname)s 文本形式的日志级别
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(message)s 用户输出的消息
%(module)s 调用日志输出函数的模块名
多模块记录日志
如果开发的程序包含多个模块,就需要考虑日志间的记录方式。基本样例如下:
主程序文件:
- # myapp.py
- import logging
- import mylib
- def main():
- logging.basicConfig(format='[%(asctime)s %(filename)s line:%(lineno)d] %(levelname)s: %(message)s',
- level=logging.DEBUG, filename="log.txt", filemode="w")
- logging.info('Started')
- mylib.do_something()
- logging.info('Finished')
- if __name__ == '__main__':
- main()
模块mylib.py的代码如下:
- import logging
- def do_something():
- logging.info('Doing something')
输出结果如下:
- D:\pycharm\work>type log.txt
- [2020-02-02 10:54:52,074 json_pro.py line:8] INFO: Started
- [2020-02-02 10:54:52,074 mylib.py line:4] INFO: Doing something
- [2020-02-02 10:54:52,074 json_pro.py line:10] INFO: Finished
日志同时输出屏幕和写入文件
logging模块可以通过FileHander和StreamHandler分别制定向文件和屏幕输出。
- import logging
- logger = logging.getLogger() # 不加名称设置root logger
- logger.setLevel(logging.DEBUG)
- formatter = logging.Formatter(
- '%(asctime)s - %(name)s - %(levelname)s: - %(message)s',
- datefmt='%Y-%m-%d %H:%M:%S')
- # 使用FileHandler输出到文件
- fh = logging.FileHandler('log.txt')
- fh.setLevel(logging.DEBUG)
- fh.setFormatter(formatter)
- # 使用StreamHandler输出到屏幕
- ch = logging.StreamHandler()
- ch.setLevel(logging.DEBUG)
- ch.setFormatter(formatter)
- # 添加两个Handler
- logger.addHandler(ch)
- logger.addHandler(fh)
- logger.info('this is info message')
- logger.warning('this is warn message')
控制台输出如下:
- [2020-02-02 10:58:16 json_pro.py line:22] INFO: this is info message
- [2020-02-02 10:58:16 json_pro.py line:23] WARNING: this is warn message
日志文件内容如下:
- D:\pycharm\work>type log.txt
- [2020-02-02 10:58:55 json_pro.py line:22] INFO: this is info message
- [2020-02-02 10:58:55 json_pro.py line:23] WARNING: this is warn message
小结
本文介绍了记录日志模块logging基本场景使用实例。如果需要更好、更灵活的使用logging模块查看官方帮助文档:https://docs.python.org/zh-cn/3/howto/logging.html
[ Python入门教程 ] Python中日志记录模块logging使用实例的更多相关文章
- [ Python入门教程 ] Python中日期时间datetime模块使用实例
Python中datetime模块提供强大易用的日期处理功能,用于记录程序操作或修改时间.时间计算.日志时间显示等功能.datatime模块重新封装了time模块,提供的类包括date.time.da ...
- [ Python入门教程 ] Python中JSON模块基本使用方法
JSON (JavaScript Object Notation)是一种使用广泛的轻量数据格式,Python标准库中的json模块提供了一种简单的方法来编码和解码JSON格式的数据.用于完成字符串和p ...
- [ Python入门教程 ] Python字典数据类型及基本操作
字典是Python中重要的数据类型,字典是由"键-值"对组成的集合,"键-值"对之间用逗号隔开,包含在一对花括号中.字典中的"值"通过&qu ...
- boost.python入门教程 ----python 嵌入c++
Python语言简介 Python是一种脚本语言.以开放的开发接口和独特的语法著称.尽管Python在国内引起注意只有几年的时间,但实际上Python出现于上世纪90年代(据www.python.or ...
- 日志记录模块logging
在python中,日志记录显示有两种方式,一种是保存在文件和打印屏幕上,一种保存在文件中. 第一种,直接保存在文件中. import logging #日志模块,方便记录日志 # 下面是配置日志记录格 ...
- [ Python入门教程 ] Python文件基本操作_shutil模块
shutil模块是对os模块中文件操作的补充,提供文件和目录的移动.复制.打包.压缩.解压等功能 shutil常用函数 shutil.copyfile(src, dst) 复制文件, 如果ds ...
- [ Python入门教程 ] Python生成随机数模块(random)使用方法
1.使用randint(a,b)生成指定范围内的随机整数.randint(a,b)表示从序列range([a,b])中获取一个随机数,包括b. >>> random.randint( ...
- [ Python入门教程 ] Python基础语法
Python的语法非常简练,因此用Python编写的程序可读性强.容易理解.本章将介绍Python的基本语法和概念. Python文件类型 1.源代码.Python的源代码的扩展名以py结尾,可直接运 ...
- [ Python入门教程 ] Python的控制语句
Python控制语句由条件语句.循环语句构成.控制语句根据条件表达式控制程序的流转.本章将介绍Python中控制语句的基本语法. 条件判断语句 (1)if条件语句 if语句用于检测某个条件是否成立.如 ...
随机推荐
- Java 学习笔记(7)——接口与多态
上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...
- Channel 9视频整理【6】
GiGi Huang https://channel9.msdn.com/Niners/GiGiHuang
- JavaScript数组的方法 | 学习笔记分享
数组 数组的四个常用方法 push() 该方法可以向数组的末尾添加一个或多个元素,并返回数组的新长度 可以将要添加的元素作为方法的参数传递,这些元素将会自动添加到数组的末尾 pop() 该方法可以删除 ...
- 【抖音测试开发日常实习】一二三四面面经,攒人品求Offer
总结: 一.流程 (估计)一面二面技术leader面,三面部门领导面,四面肯定是HR面 二.系统 用的牛客网面试系统,长相大概是这样: 打字聊天框我在听不清对面声音的时候用过,感觉没啥卵用,手撕代 ...
- 洛谷$P$2235 $Kathy$函数 $[HNOI2002]$ 数位$dp$
正解:数位$dp$ 解题报告: 传送门$qwq$ $HNOI$的题从02年就这么神了嘛$QAQ$,,, 嗷对了这题如果看出了一个结论就是个数位$dp$板子,,,?但是结论很神我$jio$得挺难看出来的 ...
- $BZOJ1799\ Luogu4127$ 月之谜 数位统计$DP$
AcWing Description Sol 看了很久也没有完全理解直接$DP$的做法,然后发现了记搜的做法,觉得好棒! 这里是超棒的数位$DP$的记搜做法总结 看完仿佛就觉得自己入门了,但是就像 ...
- 15 道 Spring Boot 高频面试题,看完直接当面霸【入门实用】
前言 本文转自松哥(网名:江南一点雨)的一篇实用入门文章,写的挺好的,希望对各位有所帮助. 什么是面霸?就是在面试中,神挡杀神佛挡杀佛,见招拆招,面到面试官自惭形秽自叹不如!松哥希望本文能成为你面霸路 ...
- wow.js 使用及效果列表
. 基本的样式列表 具体想要什么效果官网查看就行,https://daneden.github.io/animate.css/ 当然还有几个具体的方法,就是控制移入移出的时间,如下图.
- Spark设置Kryo序列化缓冲区大小
背景 今天在开发SparkRDD的过程中出现Buffer Overflow错误,查看具体Yarn日志后发现是因为Kryo序列化缓冲区溢出了,日志建议调大spark.kryoserializer.buf ...
- 13.利用pymysql创建变量类型的表名解说
在练习爬虫爬取数据时,想将爬取的数据用pymysql存储到数据库中,并且存储时的表名是一个变量,但在写完代码运行后经常出面1064的错误代码,在网上查找相关解决方法,但一直找不到完美的解决方法, 通过 ...