1,写在前面的话
之前读代码的时候接触到这个模块,但是但是没有好好研究这个模块,后来发现这个模块还是很好用的,有必要系统学习一下
先参考这个博客学习一下
介绍
Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。
其实有点读不懂啦,没关系,继续往后看
logging模块与log4j的机制是一样的,只是具体的实现细节不同。模块提供logger,handler,filter,formatter。
log4j是啥?还是有点读不懂,继续往后看
logger:提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。
handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
filter:提供一种优雅的方式决定一个日志记录是否发送到handler。
formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。
与log4j类似,logger,handler和日志消息的调用可以有具体的日志级别(Level),只有在日志消息的级别大于logger和handler的级别。
完全晕了,太抽象了,继续往下看吧
日志级别
import logging
居然本身就有这个模块,不需要安装
1,参考
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别
日志等级说明:
DEBUG:程序调试bug时使用
INFO:程序正常运行时使用
WARNING:程序未按预期运行时使用,但并不是错误,如:用户登录密码错误
ERROR:程序出错误时使用,如:IO操作失败
CRITICAL:特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使 用
默认的是WARNING等级,当在WARNING或WARNING之上等级的才记录日志信息。
RotatingFileHandler
日志回滚的意思为:比如日志文件是chat.log,当chat.log达到指定的大小之后,RotatingFileHandler自动把文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。最后重新创建 chat.log,继续输出日志信息。【这样保证了chat.log里面是最新的日志】
参考这里
1,实例化一个logger
# 基本配置
logging.basicConfig()
# 实例化一个logger
logger = logging.getLogger("my_logger")
这步操作相当于实例化了一个logger对象
getLogger()方法后面最好加上所要日志记录的模块名字,后面的日志格式中的%(name)s 对应的是这里的模块名字,也可以不填。通常logger的名字我们对应模块名,如聊天模块、数据库模块、验证模块等
logger对象的方法有:
2,设置logger的等级
logger.setLevel(logging.INFO)
3,实例化一个handler(写入器)
# 写入文件,如果文件超过100个Bytes,仅保留5个文件。
handler = logging.handlers.RotatingFileHandler('my_logger.log', maxBytes=100, backupCount=5)
# notice that 这里的'my_logger.log'对应的是实例化logger时的给的文件名称,看到博别人的博客上面加了 log/ 但是我试了之后发现行不通,去掉之后可以
# 发现实例化写入器之后才会在当前文件夹下出现'my_logger.log'文件,
原因的话应该会有更合理的解释但是现在还不知道
4, 把实例化的handler加入到之前实例化好的logger中
logger.addHandler(handler)
5,测试代码
i=0
while True:
time.sleep(0.01)
logger.info("file test")
logger.info(i)
i += 1
完整代码和运行结果
import time
import logging
import logging.handlers
# basic confif
logging.basicConfig()
# initialize a logger
logger = logging.getLogger('my_logger')
# set level
logger.setLevel(logging.INFO)
# initialize a handler
handler = logging.handlers.RotatingFileHandler('my_logger.log', maxBytes=100, backupCount=5)
logger.addHandler(handler)
i=0
while True:
time.sleep(0.01)
logger.info("file test")
logger.info(i)
i += 1