logging模块
import logging
# 1.生成一个logger对象
logger = logging.getLogger()
# 2.设置日志格式
formatter = logging.Formatter(fmt="%(asctime)s - %(levelname)s : %(message)s", datefmt='%Y-%m-%d %H:%M:%S')
# 3.生成Handler对象
handler = logging.FileHandler('log_test.log', encoding='utf-8') # FileHandler表示将日志保存到文件中
# 4.为Handler对象设置日志格式
handler.setFormatter(formatter)
# 5.为logger对象添加Handler处理器
logger.addHandler(handler)
# 6.设置日志级别
logger.setLevel(logging.INFO)
# 设置需要的日志信息
logger.info('good')
logger.debug('debug') # 级别低于info,不会输出
# 结果在log_test.log中
# 2020-06-08 17:26:52 - INFO : good
一、Logger对象
logging.getLogger('区分logger属于那个功能的日志')
区分日志是属于那个功能的日志
二、Level日志级别
CRITICAL > ERROR > WARNING > INFO > DEBUG
日志错误程度越高,级别越高
-
critical :日志设为该等级,只打印critical级别的日志,一个严重的错误,这表明程序本身可能无法继续运行
-
error : 日志设为该等级,打印
error
,critical
级别的日志,更严重的问题,软件没能执行一些功能 -
warning : 日志设为该等级,打印
warning
,error
,critical
级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作 -
info : 日志设为该等级,打印
info
,warning
,error
,critical
级别的日志,确认一切按预期运行 -
debug : 日志设为该等级,打印全部的日志,详细的信息,通常只出现在诊断问题上
三、Handler处理器
handler对象负责发送相关的信息到指定目的地
1、StreamHandler
logging.StreamHandler()
输出日志到控制台,使用StreamHandler可以类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。
2、FileHandler
logging.FileHandler(filename, encoding='UTF-8', mode='a')
输出日志在文件中,FileHandler会自动打开filename文件。
filename
是文件名字,mode
是文件打开方式,默认以a
方式打开,encoding
指定编码格式。
3、handlers.RotatingFileHandler
logging.handlers.RotaingFileHandler(filename[, mode[, maxBytes[, backupCount]]])
可以管理文件大小,当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。
-
filename
指定文件名字 -
mode
指定文件打开方式 -
maxBytes
指定日志文件的最大文件大小(如果为0,表示无限大,就不存在重命名)。例如,日志名字为log.log,当log.log达到指定的大小之后,会自动将名字改为log.log.1,如果log.log.1已存在,会先把log.log.1改为log.log.2,再log.log重命名为log.log.1,然后创建log.log继续输出日志。 -
backupCount
用于指定保留的日志文件的个数。例如,如果指定为2,表示只保留两个日志文件,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除
4、handlers.TimedRotatingFileHandler
logging.handlers.TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
间隔一定时间就自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间
-
filename
指定文件名字 -
interval
指定时间间隔 -
when
指定时间间隔单位- S 秒
- M 分
- H 小时
- D 天
-
backupCount
用于指定保留的日志文件的个数。例如,如果指定为2,表示只保留两个日志文件,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除
5、处理器的level
sh.setLevel()
,fh.setLevel()
除了logger,handler也可以设置级别,只有两个级别都通过时,才会输出日志。
四、Formatter日志格式
%(asctime)s | 打印日志的时间 |
%(filename)s | 打印当前执行程序名称 |
%(levelname)s | 打印日志级别名称 |
%(message)s | 打印日志信息 |
%(levelno)s | 打印日志级别的数值 |
%(pathname)s | 打印当前执行程序的路径 |
%(funcName)s | 打印日志的当前函数 |
%(lineno)d | 打印日志的当前行号 |
%(thread)d | 打印线程id |
%(threadName)s | 打印线程名称 |
%(process)d | 打印进程ID |
logging.Formatter(ftm, dateftm)
ftm
日志格式,例如%(asctime)s-%(filename)s-%(levelname)s: %(message)s
dateftm
时间格式,例如:%Y-%m-%d %H:%M:%S
五、日志封装成类
#! /usr/bin/python3
# -*-coding:utf-8-*-
import logging
class Logger:
def __init__(self, path, clevel=logging.DEBUG, Flevel=logging.DEBUG):
self.logger = logging.getLogger(path)
self.logger.setLevel(logging.DEBUG) # 设置logger级别
fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
# 设置CMD日志
sh = logging.StreamHandler()
sh.setFormatter(fmt)
sh.setLevel(clevel) # 设置处理器的Level
# 设置文件日志
fh = logging.FileHandler(path)
fh.setFormatter(fmt)
fh.setLevel(Flevel) # 设置处理器的Level
self.logger.addHandler(sh)
self.logger.addHandler(fh)
def debug(self, message):
self.logger.debug(message)
def info(self, message):
self.logger.info(message)
def war(self, message):
self.logger.warn(message)
def error(self, message):
self.logger.error(message)
def cri(self, message):
self.logger.critical(message)
if __name__ == '__main__':
logyyx = Logger('yyx.log', logging.ERROR, logging.DEBUG)
logyyx.debug('一个debug信息')
logyyx.info('一个info信息')
logyyx.war('一个warning信息')
logyyx.error('一个error信息')
logyyx.cri('一个致命critical信息')