我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下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')
 

最新文章

  1. Struts框架 内部资料 请勿转载 谢谢合作
  2. Html做三个平台原生APP啦
  3. Android 5.x特性概览二
  4. Samba实现Linux与Window文件的传输
  5. c#快捷键大全
  6. System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本
  7. 让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求(转)
  8. C# Unix时间戳转换为时间
  9. O、Ω、Θ表示
  10. 新测 thinkphp3.2 整合 PHPMailer 发送邮件
  11. 【bzoj2761】[JLOI2011]不重复数字
  12. SpringMVC,MyBatis项目中兼容Oracle和MySql的解决方案及其项目环境搭建配置、web项目中的单元测试写法、HttpClient调用post请求等案例
  13. Doskey命令详解
  14. RabbitMQ 在 web 页面 创建 exchange, queue, routing key
  15. Web 端自动化测试
  16. JavaScript 神奇的参数
  17. 安卓打开远程调试(免root)
  18. 【Alpha】第三次Scrum meeting
  19. UIActivityIndicatorView使用
  20. test20181016 B君的第一题

热门文章

  1. Unity 大版本更新之APK的下载与覆盖安装
  2. eclipse (ADT) svn插件 过滤上传的 文件 文件夹 一劳永逸
  3. mysql表无权限访问
  4. python2.0 s12 day8 _ socketserver学习
  5. Dubbo注册中心Zookeeper安装步骤
  6. NGUI屏幕自适应(转)
  7. C++类中的static数据成员,static成员函数
  8. Android 计算器
  9. 【linux】安装rar,并解压被压缩成多个rar的文件
  10. Fatal error Using $this when not in object context in