python日志模块备份_Python Logging模块 输出日志颜色、过期清理和日志滚动备份

这篇博客介绍了如何使用Python的logging和colorlog模块实现日志的彩色输出,以及通过RotatingFileHandler进行日志文件的滚动备份和根据日期自动清理过期日志。博客中定义了一个Log类,该类提供了方便的日志管理方法,包括不同级别的日志输出(debug、info、warning、error)以及文件和控制台的双渠道记录。
摘要由CSDN通过智能技术生成

#coding:utf-8

importloggingfrom logging.handlers importRotatingFileHandler # 按文件大小滚动备份import colorlog #控制台日志输入颜色

importtimeimportdatetimeimportos

cur_path= os.path.dirname(os.path.realpath(__file__)) #log_path是存放日志的路径

log_path = os.path.join(os.path.dirname(cur_path), 'logs')if not os.path.exists(log_path): os.mkdir(log_path) #如果不存在这个logs文件夹,就自动创建一个

logName = os.path.join(log_path, '%s.log' % time.strftime('%Y-%m-%d')) #文件的命名

log_colors_config={'DEBUG': 'cyan','INFO': 'green','WARNING': 'yellow','ERROR': 'red','CRITICAL': 'red',

}classLog:def __init__(self, logName=logName):

self.logName=logName

self.logger=logging.getLogger()

self.logger.setLevel(logging.DEBUG)

self.formatter=colorlog.ColoredFormatter('%(log_color)s[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s',

log_colors=log_colors_config) #日志输出格式

self.handle_logs()defget_file_sorted(self, file_path):"""最后修改时间顺序升序排列 os.path.getmtime()->获取文件最后修改时间"""dir_list=os.listdir(file_path)if notdir_list:return

else:

dir_list= sorted(dir_list, key=lambdax: os.path.getmtime(os.path.join(file_path, x)))returndir_listdefTimeStampToTime(self, timestamp):"""格式化时间"""timeStruct=time.localtime(timestamp)return str(time.strftime('%Y-%m-%d', timeStruct))defhandle_logs(self):"""处理日志过期天数和文件数量"""dir_list= ['report'] #要删除文件的目录名

for dir indir_list:

dirPath= os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + '\\' + dir #拼接删除目录完整路径

file_list = self.get_file_sorted(dirPath) #返回按修改时间排序的文件list

if file_list: #目录下没有日志文件

for i infile_list:

file_path= os.path.join(dirPath, i) #拼接文件的完整路径

t_list = self.TimeStampToTime(os.path.getctime(file_path)).split('-')

now_list= self.TimeStampToTime(time.time()).split('-')

t= datetime.datetime(int(t_list[0]), int(t_list[1]),

int(t_list[2])) #将时间转换成datetime.datetime 类型

now = datetime.datetime(int(now_list[0]), int(now_list[1]), int(now_list[2]))if (now - t).days > 6: #创建时间大于6天的文件删除

self.delete_logs(file_path)if len(file_list) > 4: #限制目录下记录文件数量

file_list = file_list[0:-4]for i infile_list:

file_path=os.path.join(dirPath, i)print(file_path)

self.delete_logs(file_path)defdelete_logs(self, file_path):try:

os.remove(file_path)exceptPermissionError as e:

Log().warning('删除日志文件失败:{}'.format(e))def __console(self, level, message):#创建一个FileHandler,用于写到本地

fh = RotatingFileHandler(filename=self.logName, mode='a', maxBytes=1024 * 1024 * 5, backupCount=5,

encoding='utf-8') #使用RotatingFileHandler类,滚动备份日志

fh.setLevel(logging.DEBUG)

fh.setFormatter(self.formatter)

self.logger.addHandler(fh)#创建一个StreamHandler,用于输出到控制台

ch =colorlog.StreamHandler()

ch.setLevel(logging.DEBUG)

ch.setFormatter(self.formatter)

self.logger.addHandler(ch)if level == 'info':

self.logger.info(message)elif level == 'debug':

self.logger.debug(message)elif level == 'warning':

self.logger.warning(message)elif level == 'error':

self.logger.error(message)#这两行代码是为了避免日志输出重复问题

self.logger.removeHandler(ch)

self.logger.removeHandler(fh)

fh.close()#关闭打开的文件

defdebug(self, message):

self.__console('debug', message)definfo(self, message):

self.__console('info', message)defwarning(self, message):

self.__console('warning', message)deferror(self, message):

self.__console('error', message)if __name__ == "__main__":

log=Log()

log.debug("---测试开始----")

log.info("操作步骤")

log.warning("----测试结束----")

log.error("----测试错误----")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值