Python–logging模块知多少
我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志。
介绍一下logging模块,logging模块就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不同的工作:
Logger 记录器,暴露了应用程序代码能直接使用的接口;简单点说就是一个创建一个办公室,让人在里头工作
Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地;这个简单点说就是办事的人,你可以指定是让在控制输出日志,还是在文件里面打印日志,常用的有4种:
StreamHandler 控制台输出
FileHandler 文件输出
下面两种需要导入
handlers
                        from logging import handlers
TimedRotatingFileHandler 按照时间自动分割日志文件
RotatingFileHandler 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
Filter
过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。(不常用)
Formatter
格式化器,指明了最终输出中日志记录的布局。指定输出日志的格式
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | import logging from logging import handlers #只在控制台打印日志 logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别                     format=                     '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'                     #日志格式                     ) logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息') logging.info('info级别,正常输出信息,一般用来打印一些正常的操作') logging.warning('waring级别,一般用来打印警信息') logging.error('error级别,一般用来打印一些错误信息') logging.critical('critical级别,一般用来打印一些致命的错误信息') | 
日志级别 debug < info < warning < error < critical
设
置了日志级别之后,会打印该级别以及比该级别高的所有日志,举个例子,如果日志级别是warning,那么就会打印warning、error、
critical,这三个级别的日志,不会打印debug和info级别的,如果是debug,最低级别的日志,那么所有的日志都会打印。
上面的只是在控制台打印日志,并没有把日志写在文件里面,一般我们都会把日志写在日志文件里面,也很简单,只需要加个参数指定文件名就行了。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别                     filename='log.txt',#文件名                     filemode='a',#模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志                     #a是追加模式,默认如果不写的话,就是追加模式                     format=                     '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'                     #日志格式                     ) logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息') logging.info('info级别,正常输出信息,一般用来打印一些正常的操作') logging.warning('waring级别,一般用来打印警信息') logging.error('error级别,一般用来打印一些错误信息') logging.critical('critical级别,一般用来打印一些致命的错误信息') | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 可以指定日志的输出格式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: 打印日志信息 我在工作中给的常用格式在前面已经看到了。就是: format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s' 这个格式可以输出日志的打印时间,是哪个文件第几行输出的,输出的日志级别是什么,以及输入的日志内容。 | 
加上文件名之后就会发现控制台不会输出日志了,日志文件也产生了,那么如何既在控制台输出日志,也在文件中写入呢?
怎么实现呢,就得有个办公室,里面塞俩人,一个给负责往控制台输出日志,一个负责写文件,你把他俩往办公室一塞,他俩就能干活了。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import logging from logging import handlers logger = logging.getLogger('my_log') #先创建一个logger对象,相当于这个办公室,也就是上面说的Logger logger.setLevel(logging.INFO)#设置日志的总级别 fh = logging.FileHandler('test.log',mode='a',encoding='utf-8')#创建一个文件处理器,也就是把日志写到文件里头 fh.setLevel(logging.INFO)#设置文件输出的级别 sh = logging.StreamHandler()#创建一个控制台输出的处理器,这两个就是上面说的Handler sh.setLevel(logging.INFO) #设置控制台输出的日志级别,这两个级别都可以单独设置,他们俩和logger的级别区别是如果logger设置的级别比里面的handler级别设置的高,那么就以logger的级别为准 th = handlers.TimedRotatingFileHandler('time',when='S',interval=1,backupCount=2) #指定间隔时间自动生成文件的处理器 #interval是时间间隔,backupCount是备份文件的个数,如果超过这个超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:             # S 秒             # M 分             # H 小时、             # D 天、             # W 每星期(interval==0时代表星期一)             # midnight 每天凌晨 th.setLevel(logging.INFO) formater = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s') #指定日志格式,上面咱们写了常用的格式,直接指定了就行了,这也就是咱们上面说的Formatter sh.setFormatter(formater) fh.setFormatter(formater) th.setFormatter(formater) #设置两个处理器的日志格式 logger.addHandler(sh) logger.addHandler(fh) logger.addHandler(th) #把两个handler加入容器里头,相当于把工作人员培训完了,你们可以上班了 logger.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息') logger.info('info级别,正常输出信息,一般用来打印一些正常的操作') logger.warning('waring级别,一般用来打印警信息') logger.error('error级别,一般用来打印一些错误信息') logger.critical('critical级别,一般用来打印一些致命的错误信息') | 
这样logger这个日志办公室已经搞好了,咱们就可以直接用了,运行完发现文件也产生了,控制台也有日志。如果不设置日志级别的话,默认级别是waring。
下面我们自己封装一个类来使用logging模块,方便使用,默认加一些配置
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import logging from logging import handlers class Logger(object):     level_relations = {         'debug':logging.DEBUG,         'info':logging.INFO,         'warning':logging.WARN,         'error':logging.ERROR,         'crit':logging.CRITICAL     }#日志级别关系映射     def __init__(self,fp,level='debug',when='midnight',interval=1,backCount=5,encoding='utf-8'):         '''         :param fp:日志文件路径         :param level: 日志级别 默认是debug         :param when: 分割日志的单位 S 秒、M 分、 H 小时、 D 天、 W 每星期(interval==0时代表星期一)、midnight 每天凌晨         :param interval: 时间间隔 默认每天凌晨         :param backCount: 备份文件个数 默认5个         :param encoding: 日志文件编码         '''         self.level = self.level_relations.get(level)         self.logger = logging.getLogger(fp)         self.logger.setLevel(self.level)         fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')         sh = logging.StreamHandler()         sh.setFormatter(fmt)         sh.setLevel(self.level)         th = handlers.TimedRotatingFileHandler(fp,when=when,interval=interval,backupCount=backCount,encoding=encoding)         th.setFormatter(fmt)         th.setLevel(self.level)         self.logger.addHandler(th)         self.logger.addHandler(sh)     def debug(self,msg):         self.logger.debug(msg)     def info(self,msg):         self.logger.info(msg)     def warning(self,msg):         self.logger.warning(msg)     def error(self,msg):         self.logger.error(msg)     def crit(self,msg):         self.logger.critical(msg) if __name__ == '__main__':     l = Logger('a.log')#实例化     l.info('hehehe')#调用 | 
Python–logging模块知多少的更多相关文章
- python logging模块可能会令人困惑的地方
		python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ... 
- python logging模块使用
		近来再弄一个小项目,已经到收尾阶段了.希望加入写log机制来增加程序出错后的判断分析.尝试使用了python logging模块. #-*- coding:utf-8 -*- import loggi ... 
- 读懂掌握 Python logging 模块源码 (附带一些 example)
		搜了一下自己的 Blog 一直缺乏一篇 Python logging 模块的深度使用的文章.其实这个模块非常常用,也有非常多的滥用.所以看看源码来详细记录一篇属于 logging 模块的文章. 整个 ... 
- (转)python logging模块
		python logging模块 原文:http://www.cnblogs.com/dahu-daqing/p/7040764.html 1 logging模块简介 logging模块是Python ... 
- Python logging 模块学习
		logging example Level When it's used Numeric value DEBUG Detailed information, typically of interest ... 
- python logging—模块
		python logging模块 python logging提供了标准的日志接口,python logging日志分为5个等级: debug(), info(), warning(), error( ... 
- Python logging模块无法正常输出日志
		废话少说,先上代码 File:logger.conf [formatters] keys=default [formatter_default] format=%(asctime)s - %(name ... 
- 0x03 Python logging模块之Formatter格式
		目录 logging模块之Formatter格式 Formater对象 日志输出格式化字符串 LogRecoder对象 时间格式化字符串 logging模块之Formatter格式 在记录日志是,日志 ... 
- 0x01 Python logging模块
		目录 Python logging 模块 前言 logging模块提供的特性 logging模块的设计过程 logger的继承 logger在逻辑上的继承结构 logging.basicConfig( ... 
随机推荐
- zzuli  1430   多少个0
			https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1430 1430: 多少个0 Time Limit: 1 Sec Memory Limit: 12 ... 
- 连接ACCESS
			access2000-2003数据库连接字符串: ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=数据库名.mdb"; ... 
- mysql判断表记录是否存在,不存在则插入新纪录
			开始以为和SQL Server一样,使用not exists进行判断,结果不行: ) INSERT INTO vrv_paw_template(templateName,templateFileNam ... 
- html5-  摘自网友dudu
			HTML5中新增了<canvas>画布标签,通过它,可以使用JavaScript在网页中绘制图像.<canvas>标签在网页中得到的是一个矩形空白区域,可以通过width和he ... 
- spring创建单例bean
			(使用的spring版本是3.2.10) 在xml文件中配置一个普通的bean,默认使用单例,创建该bean的调用栈如下: ClassPathXmlApplicationContext //Class ... 
- 关于display:grid layout
			.wrapper { display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 10px; grid-auto-rows: min ... 
- 快速切题 poj3026
			感受到出题人深深的~恶意 这提醒人们以后...数字后面要用gets~不要getchar 此外..不要相信那个100? Borg Maze Time Limit: 1000MS Memory Lim ... 
- 《Python》 while循环、运算符和编码初识
			一.while 循环 while也叫无限循环 while 条件: 循环体 判断条件: 条件为真,进入循环体,循环体执行到底部,返回,继续判断条件. 终止循环: 1.改变条件(标志位的概念) 2.bre ... 
- Alphabet Cookies
			Alphabet Cookies 题目描述 Kitty likes cookies very much, and especially the alphabet cookies. Now, she g ... 
- DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储
			DevExpress年终击穿底价,单套授权低至67折!查看详情>>> 在上篇随笔<DevExpress XtraScheduler日程管理控件应用实例(1)-- 基本使用> ... 
