python日志模块----logging:
使用python的logging模块能很好的帮我们完成程序的日志功能,其实它跟java中的log4j有不少相似的地方。下面记录下今天学习到的logging的知识(因为有一些还没真正使用过,不知道是否说得对,希望大家看到有说的不对的地方可以告诉下小弟,谢谢!)。
1)像其它的语言那样,python里的logging信息同样也是分为5个等级,从低到高依次是:DEBUG,INFO,WARNING,ERROR,CRITICAL
2)python中,logging由logger,handler,filter,formater四个部分组成,logger是提供我们记录日志的方法;handler是让我们选择日志的输出地方,如:控制台,文件,邮件发送等,一个logger添加多个handler;filter是给用户提供更加细粒度的控制日志的输出内容;formater用户格式化输出日志的信息。
3)logger的级别划分,python中,
root是默认的最高级别的,其它的logger的级别通过"."来划分等级,如:bao,bao.a,bao.b三个logger,bao.a和bao.b都的级别都低于bao,依此类推。
4)python中配置logging有三种方式:
第一
、在程序中完成logger,handler,filter,formater的实例化被配置好logging,然后再使用logging取得logger进行日志操作。
第二
、使用配置文件的方式配置logging,使用fileConfig(filename,defaults=None,disable_existing_loggers=Ture
)函数来读取配置文件。
第三
、使用一个字典方式来写配置信息,然后使用dictConfig(dict,defaults=None,
disable_existing_loggers=Ture
)函数来瓦按成logging的配置
。(这个方式没有仔细看,所以没有怎么说,具体可以看文档)
注意:
在使用第二种和三种方式配置logging的时候,第三个参数默认值是True,当它为True的时候,在这之前定义的logging配置就是失效,不能再使用,也就是只有配置文件或者配置字典里有的内容才能使用。如果先让之前的logging配置依然有限就要把这个参数设为False,或者一直就是使用配置文件或者配置字典的方式来对logging进行配置。
下面我们使用代码logging的代码来说明:
使用baseConfig()函数对
logging进行
简单的
配置:
import logging;
# 使用baseConfig()函数,可选参数有filename,filemode,format,datefmt,level,stream
# 有filename是文件日志输出,filemode是'w'的话,文件会被覆盖之前生成的文件会被覆盖。datafmt参数用于格式化日期的输出
logging.basicConfig(filename="config.log",filemode="w",format="%(asctime)s-%(name)s-%(levelname)s-%(message)s",level=logging.INFO);
logger = logging.getLogger("log_demo");
# 使用logger输出日志信息
logger.debug("debug");
logger.info("info");
logger.warning("warning");
logger.error("error");
logger.critical("critiacl");
通过初始化logger,handler,formater来配置logging:
import logging;
# logging模块由logger,handler,filter,fomatter四个部分组成
# 获取一个logger对象
logger = logging.getLogger("haha");
# 设置日志输出等级
logger.setLevel(logging.DEBUG);
# 创建一个文件的handler
f_handler = logging.FileHandler("xxx.log");
f_handler.setLevel(logging.INFO);
# 创建一个控制台的handler
c_handler = logging.StreamHandler();
c_handler.setLevel(logging.WARNING);
# 设置日志的输出格式
fmt = logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s");
# 给handler绑定一个fomatter类
f_handler.setFormatter(fmt);
c_handler.setFormatter(fmt);
# 绑定一个handler
logger.addHandler(f_handler);
logger.addHandler(c_handler);
# 使用logger输出日志信息
logger.debug("debug");
logger.info("info");
logger.warning("warning");
logger.error("error");
logger.critical("critiacl");
使用配置文件实现logging的配置:
import logging
import logging.config
# 使用配置文件配置logging
logging.config.fileConfig("config.conf");
logger = logging.getLogger("simpleExample");
# 使用logger
logger.debug("debug");
logger.info("info");
logger.warning("warning");
logger.error("error");
logger.critical("critiacl");
与之对应的配置文件内容如下:
[loggers]
keys=root,simpleExample
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_simpleExample]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=simpleExample
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=WARNING
formatter=simpleFormatter
args=("file_config_log.log", "a")
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
上面的配置文件中:由[loggers],[handlers],[formaters]
信息,keys对应实例化是他们的名称,多个用逗号隔开。然后再分别配置各个logger,handler,formaters。以logger为例,logger下有root和simpleExample两个logger,就要配置[logger_root]和[logger_simpleExample];类似的,handler和formater也是这样。
在[logger_name]
中的参数purlname
,是设置logging.getLoger(name)中的name值;propagete参数
:propagete=0,表示输出日志,但消息不传递;propagate=1是输出日志,同时消息往更高级别的地方传递。若上面配置文件参数progagate=1,simpleExample的更高级logger有root,输出的结果会是:
2012-08-06 23:07:18,483 - simpleExample - DEBUG - debug
2012-08-06 23:07:18,483 - simpleExample - DEBUG - debug
2012-08-06 23:07:18,483 - simpleExample - INFO - info
2012-08-06 23:07:18,483 - simpleExample - INFO - info
2012-08-06 23:07:18,483 - simpleExample - WARNING - warning
2012-08-06 23:07:18,483 - simpleExample - WARNING - warning
2012-08-06 23:07:18,483 - simpleExample - ERROR - error
2012-08-06 23:07:18,483 - simpleExample - ERROR - error
2012-08-06 23:07:18,483 - simpleExample - CRITICAL - critiacl
2012-08-06 23:07:18,483 - simpleExample - CRITICAL - critiacl
最后是
[hander_name]
配置下的args参数,其实就是你使用的handler类型的初始化函数的参数。
分享到:
相关推荐
看python做的一些小笔记,具体内容是自己的笔记,怎么办没话说了,为什么描述要那么多字,但是发射点发射点v反对豆腐干豆腐干发士大夫v倒是方便
14.6_None|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬虫实战完全解读
14.2_用字典映射代替switch_case语句|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原
14.11_Python_3.8_新增海象运算符|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生
14.13_Python_3.7_新增数据类dataclass装饰器|Pythonic与Python杂记|Python3.8入门
14.1_导言|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬虫实战完全解读
14.5_iterator与generator|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬
14.10_论编程能力|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬虫实战完全解读
14.9_装饰器的副作用|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬虫实战完全解读
14.12_f关键字做字符串拼接|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬虫实战完全解读
14.4_字典如何编写列表推导式|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬虫实战完全解读
14.7_对象存在并不一定是True|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬虫实战完全
第十四章“Pythonic与Python杂记”则探讨Python的编程风格,如PEP8编码规范,以及一些Python特有的习惯用法和小技巧,提升你的编程素养。 通过这个全面的Python3入门视频教程,你将掌握从基础到高级的Python编程...
14.8___len__与__bool__内置方法|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原
14. **Pythonic与Python杂记**:探讨Python编程的最佳实践,例如PEP8编码规范,以及Python社区的一些习惯用法和库的使用技巧。 视频教程结合源代码学习,能帮助学习者更好地理解和应用所学知识,逐步成为一名熟练的...
在Python中,我们可以利用OpenCV库来处理图像和视频,包括调用摄像头、捕获视频帧、进行图像处理以及进行机器学习相关的图像识别任务。 【Python OpenCV调用摄像头】 在Python中使用OpenCV调用摄像头,首先需要...
在这一章节中,学员将了解到Python中模块和包的概念,学会如何使用标准库和第三方库扩展功能。此外,还会讲解函数的定义与调用,以及局部变量和全局变量的区别。 ### 第8章 Python函数 本章重点介绍函数的设计原则...
### 第14章 Pythonic与Python杂记 - **课程目标**:提高Python编程水平的小技巧与最佳实践。 - **核心知识点**: - Pythonic编程风格 - 常见问题解答 - 提高效率的编程技巧 - 实用工具与库的推荐 通过以上详细...
- Python杂记:学习过程中的笔记和心得。 2. **原生爬虫实战**: - 使用Python标准库实现网页抓取。 - 数据解析:使用BeautifulSoup、lxml等工具。 - 数据存储:CSV、JSON、数据库等。 通过以上知识点的学习,...
通过分析和理解这个五子棋游戏的源码,不仅可以提升Python编程技能,还能了解到游戏开发的基本流程,对AI策略和图形界面设计有初步认识,对于想要从事游戏开发或软件工程的学生来说,这是一个很好的学习资源。