工作上,基于python3开发了一些功能,上线前需要添加日志功能,之前的日志配置可以输出指定规则的日志,但缺少根据时间,自动拆分日志和删除日志,这在使用和运行维护上,很不有好。
经过一番搜索、学习和测试,基于自带的logger,终于配置出自己满意的日志配置,自身提供三种方法,日志文件不拆分,按天拆分,按大小拆分,删除多余日志,详细如下:
#!/usr/bin/python
#coding:utf-8
'''
日志工具类
time:2019-11-12
author:wangzonghui
'''
#!/usr/bin/python
#coding:utf-8
import logging,os,sys
import logging.handlers
def script_path():
'''
获取项目目录
'''
path = os.path.realpath(sys.argv[0])
if os.path.isfile(path):
path = os.path.dirname(path)
return os.path.abspath(path)
#创建日志目录
log_path = os.path.join(script_path(),'logs')
if not os.path.exists(log_path):
os.makedirs(log_path)
#日志内容格式
message_format = '%(asctime)s %(levelname)s %(pathname)s(line:%(lineno)d) %(message)s'
def getLog(filename="my-all.log"):
'''
获取日志
filename:日志文件名或绝对路基加文件名,默认目录logs,文件名my-all.log,文件不自动分隔
'''
log_file = os.path.join(log_path,filename)
logging.basicConfig(level=logging.DEBUG,format=message_format)
log=logging.getLogger(filename)
if not log.handlers: #避免重复加载handler
file= logging.FileHandler(log_file,encoding='utf-8')
file.setFormatter(logging.Formatter(message_format))
log.addHandler(file)
return log
def getDayLog(filename="my-day.log",when="MIDNIGHT",backupCount=30):
'''
获取日志对象,24小时拆分一次
filename:日志文件名或绝对路基加文件名,默认目录logs,文件名my-day.log,按天自动拆分
when:间隔多久拆分一次,默认MIDNIGHT,每天过0点执行,可填写:S、M、H、D(MIDNIGHT)、W
backupCount:存储拆分文件个数
'''
log_file = os.path.join(log_path,filename)
logging.basicConfig(level=logging.DEBUG,format=message_format)
log = logging.getLogger(filename) #定义对应程序模块名,默认root
if not log.handlers:
file =logging.handlers.TimedRotatingFileHandler(log_file,when=when,interval=1,backupCount=backupCount,encoding='utf-8')
file.setFormatter(logging.Formatter(message_format))
log.addHandler(file)
return log
def getFileSizeLog(filename="my-size.log",filesize=100*1024*1024,backupCount=30):
'''
获取日志对象,文件大小超过fileSize大小拆分文件
filename:日志文件名或绝对路基加文件名,默认目录logs,文件名my-size.log,按大小拆分
filesize:单个日志文件最大值,单位是bytes,默认100*1024*1024=100M,重命名文件名为my.log.1
backupCount:存储拆分文件个数
'''
log_file = os.path.join(log_path,filename,format=message_format)
logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger(filename) #定义对应程序模块名,默认root
#定义过滤条件
if not log.handlers:
file=logging.handlers.RotatingFileHandler(log_file,maxBytes=filesize,backupCount=backupCount,encoding='utf-8')
file.setFormatter(logging.Formatter(message_format))
log.addHandler(file)
return log
提供三个方法,可自定义日志文件名,日志存储在启动目录,logs目录下:
getLog:日志自动累加,不会自动拆分
getDayLog:根据时间自动拆分,默认每天过0点拆分一次,保存30天
getFileSizeLog:根据文件大小自动拆分,默认100M拆分一次,保存30个文件
说明:
Python日志系统不像java,整个项目加载一个配置文件,默认每个py文件可以加载自己日志配置,如果公共模块想要输出到不同启动程序中,建议logging参数传递。