python学习笔记(二十八)日志模块
我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志。
介绍一下logging模块,logging模块就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不同的工作:
Logger 记录器,暴露了应用程序代码能直接使用的接口;简单点说就是一个创建一个办公室,让人在里头工作
Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地;这个简单点说就是办事的人,你可以指定是让在控制输出日志,还是在文件里面打印日志,常用的有4种:
StreamHandler 控制台输出
FileHandler 文件输出
下面两种需要导入
handlers
from logging import handlers
TimedRotatingFileHandler 按照时间自动分割日志文件
RotatingFileHandler 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
Filter过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。(不常用)
Formatter格式化器,指明了最终输出中日志记录的布局。指定输出日志的格式
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,最低级别的日志,那么所有的日志都会打印。
上面的只是在控制台打印日志,并没有把日志写在文件里面,一般我们都会把日志写在日志文件里面,也很简单,只需要加个参数指定文件名就行了。
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级别,一般用来打印一些致命的错误信息')
加上文件名之后就会发现控制台不会输出日志了,日志文件也产生了,那么如何既在控制台输出日志,也在文件中写入呢?
怎么实现呢,就得有个办公室,里面塞俩人,一个给负责往控制台输出日志,一个负责写文件,你把他俩往办公室一塞,他俩就能干活了。
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=,backupCount=)
#指定间隔时间自动生成文件的处理器
#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模块,方便使用,默认加一些配置
import logging
from logging import handlers
class MyLogger():
def __init__(self,file_name,level='info',backCount=,when='M'):
logger = logging.getLogger() # 先实例化一个logger对象,先创建一个办公室
logger.setLevel(self.get_level(level)) # 设置日志的级别的人
cl = logging.StreamHandler() # 负责往控制台输出的人
bl = handlers.TimedRotatingFileHandler(filename=file_name, when=when, interval=, backupCount=backCount, encoding='utf-8')
fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s') #时间 #打印哪个python文件的第几行 #日志级别 #打印的信息
cl.setFormatter(fmt) # 设置控制台输出的日志格式
bl.setFormatter(fmt) # 设置文件里面写入的日志格式
logger.addHandler(cl)
logger.addHandler(bl)
self.logger = logger def get_level(self,str):
level = {
'debug':logging.DEBUG,
'info':logging.INFO,
'warn':logging.WARNING,
'error':logging.ERROR
}
str = str.lower()
return level.get(str)
if __name__ == '__main__':
lw_log = MyLogger('lw.log','debug',when='M')
lw_log.logger.warning('哈哈哈')
由于logging模块用起来实在是费劲,所以牛教授自己封装了一个日志模块供大家使用,非常方便,只需要直接pip install nnlog即可
使用例子如下代码:
import nnlog
log = nnlog.Logger(file_name='my.log',level='debug',when='D',backCount=,interval=)
#file_name是日志文件名
#level是日志级别,如果不传的话默认是debug级别
#when是日志文件多久生成一个,默认是按天,S 秒、M 分、 H 小时、 D 天、 W 每星期
#backCount是备份几个日志文件,默认保留5天的
#interval是间隔多久生成一个日志文件,默认是1天
log.debug('默认日志级别是debug')
log.info('info级别')
log.warning('waring级别')
log.error('error级别') log2 = nnlog.Logger(file_name='nn.log') #直接传入文件名也是ok的,其他的就取默认值了
log2.debug('test')
python学习笔记(二十八)日志模块的更多相关文章
- Python学习日记(二十八) hashlib模块、configparse模块、logging模块
hashlib模块 主要提供字符加密算法功能,如md5.sha1.sha224.sha512.sha384等,这里的加密算法称为摘要算法.什么是摘要算法?它又称为哈希算法.散列算法,它通过一个函数把任 ...
- Python学习札记(二十八) 模块1
参考:模块 NOTE 1.模块:一个.py文件称为一个模块. 2.代码模块化的意义:a.提升程序的可维护性 b.不用重复造轮子 3.避免模块冲突,解决方法:引入了按目录来组织模块的方法,称为包(Pac ...
- python学习笔记(十八)网络编程之requests模块
上篇博客中我们使用python自带的urllib模块去请求一个网站,或者接口,但是urllib模块太麻烦了,传参数的话,都得是bytes类型,返回数据也是bytes类型,还得解码,想直接把返回结果拿出 ...
- angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构
ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...
- Java基础学习笔记二十八 管家婆综合项目
本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...
- Python学习笔记第十八周
目录: 一.JavaScript正则表达式 1.test 2.exec 二.BootStrap 1.响应式 2.图标.字体 3.基本使用 三.Django 1.安装 2.创建目录 3.进入 ...
- Java学习笔记二十八:Java中的接口
Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...
- python学习笔记(十八)python操作excel
python操作excel需要安装通过pip安装xlwt, xlrd这两个模块: pip install xlwt pip insall xlrd 操作excel ,写入excel: import x ...
- python学习笔记(十)常用模块
import os print(os.getcwd())#取当前工作目录,绝对路径 print(os.chdir("../"))#更改当前目录,.代表当前目录,..代表上一级目录 ...
- angular学习笔记(二十八-附2)-$http,$resource中的promise对象
下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...
随机推荐
- 苹果降频门:旧款iPhone哪些功能受到影响
要说苹果最近发生的大事,就数网络上传的沸沸扬扬的降频门事件了,近期苹果在新发布的iOS 11系统中新增了一项功能,意在降低旧款手机的电量消耗,但限制了旧款iPhone的性能,那么iPhone有哪些功能 ...
- struts2基础---->自定义类型转换器
这一章,我们开始struts2中自定义类型转换器的学习. 自定义类型转换器
- JS:“分享到”之类的悬浮框的运动原理(代码)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- bootstrap之表单
一.表单布局 向父 <form> 元素添加 role="form". 把标签和控件放在一个带有 class .form-group 的 <div> 中.这是 ...
- ELK平台介绍
在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段: 以下内容来自:http://baidu.blog.51cto.com/71938/1676798 日志主要包括系统日志.应用程序日志和安全 ...
- iOS 如何在视图中添加一个用xib创建的view
NSArray *nib = [[NSBundle mainBundle]loadNibNamed:[pages objectAtIndex:] owner:self options:nil]; // ...
- 批量远程执行linux服务器程序--基于pxpect(多进程、记日志版)
#!/usr/bin/python '''Created on 2015-06-09@author: Administrator''' import pexpect import os,sys fro ...
- Android中textView自动识别电话号码,电子邮件,网址(自动加连接)
extends:http://blog.csdn.net/wx_962464/article/details/8471195 其实这个是很简单的,在android中已经为我们实现了,但是我估计很多人都 ...
- EDT改成CST
功能说明:显示文字.语 法:echo [-ne][字符串]或 echo [--help][--version]补充说明:echo会将输入的字符串送往标准输出.输出的字符串间以空白字符隔开, 并在最后加 ...
- Ext学习系列(1)初识Ext
Ext 基础页设置: <!-- 最好不要设置的文件头,避免IE的问题 --><html> <!-- 每份有效的HTML应符合标准,为此head标签不能少 -->&l ...