版权声明:本文为博主原创文章,转载请注明出处,感谢! https://blog.csdn.net/ljj_18539663587/article/details/88652446
logging日志模块的使用,TimedRotatingFileHandler和RotatingFileHandler日志分割
一.代码中直接使用
单个脚本文件中可以直接使用
import logging
# 配置日志格式,日期格式,日志文件名,日志等级
logFormat = "%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s"
dateFormat = "%Y/%m/%d %H:%M:%S"
logging.basicConfig(filename='test.log', filemode='a+', format=logFormat, datefmt=dateFormat, level=logging.INFO)
# 伪造异常捕获
def catch_exception():
try:
result = 2 // 0
logging.info(result)
except Exception as e:
logging.exception(e)
if __name__ == '__main__':
catch_exception()
二.封装到函数中使用
自定义日志函数,参数为日志文件保存路径,所有信息全部打印在test.log文件当中.
建议把日志函数独立封装在py文件当中,使用时直接导入后调用,这里为了方便展示直接写在一个文件当中.
import logging
def my_log(fileName):
# 创建一个日志记录器logger,设置全局等级
logger = logging.getLogger("logger")
logger.setLevel(logging.INFO)
# 创建一个文件记录日志的handler,设置级别为info
fileHandler = logging.FileHandler(filename="{}.log".format(fileName))
fileHandler.setLevel(logging.INFO)
# 创建一个全局的日志格式
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
# 将日志格式添加到fileHandler
fileHandler.setFormatter(formatter)
# 将日志handler添加到logger中
logger.addHandler(fileHandler)
return logger
# 伪造异常捕获,调用封装的日志函数my_log(),传入文件路径
def catch_exception():
logger = my_log('test')
try:
result = 2 // 0
logger.info(result)
except Exception as e:
logger.exception(e)
if __name__ == '__main__':
catch_exception()
三.日志文件和terminal划分等级输出
代码中调用日志函数后,编辑时所有信息全部添加到文件当中,查看报错信息需要打开日志文件,很不友好.
logging提供文件和terminal同时输出的handler,terminal栏输出我们想看到的error信息.
import logging
def my_log(fileName):
logger = logging.getLogger("logger")
logger.setLevel(logging.INFO)
# 创建一个文件记录日志的handler,设置级别为info
fileHandler = logging.FileHandler(filename="{}.log".format(fileName))
fileHandler.setLevel(logging.INFO)
# 同时创建一个在终端输出的handler,级别为error
streamHandler = logging.StreamHandler()
streamHandler.setLevel(logging.ERROR)
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
# 将日志格式器添加到两个handler中
fileHandler.setFormatter(formatter)
streamHandler.setFormatter(formatter)
# 将两个handler添加到logger中
logger.addHandler(fileHandler)
logger.addHandler(streamHandler)
return logger
def catch_exception():
logger = my_log('test1')
try:
logger.info('只在日志文件中展示')
result = 2 // 0
logger.info(result)
except Exception as e:
logger.exception(e) # 报错信息除了记录在文件当中,终端也同时输出
if __name__ == '__main__':
catch_exception()
四.TimedRotatingFileHandler按时间间隔分割日志文件
TimedRotatingFileHandler参数介绍:
filename:日志文件名
when:时间单位 S–秒 M–分 H–时 D—天 大小写不敏感
interval:间隔多长时间分割一个日志文件
backupCount:保留最近文件的个数
生成的日志文件格式基本固定,如果需要更改还需要修改对应的正则,日志格式( runTest.2019-03-18_14:15:20.log)
import re
import time
import logging.handlers
def my_log():
logger = logging.getLogger('logger')
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
# 设置时间间隔,保留文件个数,日志名
filehandler = logging.handlers.TimedRotatingFileHandler(filename='runTest', when='s', interval=10, backupCount=3)
# 设置日志后缀,和对应的正则,一定要设置对才能得到想要的结果
filehandler.suffix = '%Y-%m-%d_%H:%M:%S.log'
filehandler.extMatch = re.compile(r'^\d{4}-\d{2}-\d{2}_\d{2}:\d{2}:\d{2}.log$')
filehandler.setFormatter(formatter)
logger.addHandler(filehandler)
return logger
if __name__ == '__main__':
logger = my_log()
while True:
time.sleep(1) # 间隔一秒循环执行,一段时间后中断执行,验证日志文件时间和个数,是否和设置的一样
try:
a = 3 / 0
except Exception as e:
logger.exception(e)
五.RotatingFileHandler按照文件大小分割日志文件
代码实现:以日志文件大小10B进行分割,保留最近5个文件(具体情况自己设定参数,此处是为了快速展示输出的效果)
项目中日志文件一般都按照时间进行分割
import time
import logging.handlers
def my_log():
logger = logging.getLogger('logger')
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
# maxBytes文件大小 单位为B ,backupCount最大备份数 生成的日志文件名称格式 runTest.log.1
filehandler = logging.handlers.RotatingFileHandler(filename='runTest.log', maxBytes=10, backupCount=5)
filehandler.setFormatter(formatter)
logger.addHandler(filehandler)
return logger
if __name__ == '__main__':
logger = my_log()
while True:
time.sleep(1)
try:
a = 3 / 0
except Exception as e:
logger.exception(e)