python logging 日志轮转文件不删除问题的解决方法


Posted in Python onAugust 02, 2016

前言

最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据。

分析

项目使用了 logging 的 TimedRotatingFileHandler :

#!/user/bin/env python
# -*- coding: utf-8 -*-

import logging
from logging.handlers import TimedRotatingFileHandler
log = logging.getLogger()
file_name = "./test.log"
logformatter = logging.Formatter('%(asctime)s [%(levelname)s]|%(message)s')
loghandle = TimedRotatingFileHandler(file_name, 'midnight', 1, 2)
loghandle.setFormatter(logformatter)
loghandle.suffix = '%Y%m%d'
log.addHandler(loghandle)
log.setLevel(logging.DEBUG)

log.debug("init successful")

参考 python logging 的官方文档:

https://docs.python.org/2/library/logging.html

查看其 入门 实例,可以看到使用按时间轮转的相关内容:

import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# 'application' code
logger.debug('debug message')

粗看下,也看不出有什么不对的地方。

那就看下logging的代码,找到TimedRotatingFileHandler 相关的内容,其中删除过期日志的内容:

logging/handlers.py

def getFilesToDelete(self):
  """
  Determine the files to delete when rolling over.

  More specific than the earlier method, which just used glob.glob().
  """
  dirName, baseName = os.path.split(self.baseFilename)
  fileNames = os.listdir(dirName)
  result = []
  prefix = baseName + "."
  plen = len(prefix)
  for fileName in fileNames:
   if fileName[:plen] == prefix:
    suffix = fileName[plen:]
    if self.extMatch.match(suffix):
     result.append(os.path.join(dirName, fileName))
  result.sort()
  if len(result) < self.backupCount:
   result = []
  else:
   result = result[:len(result) - self.backupCount]
  return result

轮转删除的原理,是查找到日志目录下,匹配suffix后缀的文件,加入到删除列表,如果超过了指定的数目就加入到要删除的列表中,再看下匹配的原理:

elif self.when == 'D' or self.when == 'MIDNIGHT':
   self.interval = 60 * 60 * 24 # one day
   self.suffix = "%Y-%m-%d"
   self.extMatch = r"^\d{4}-\d{2}-\d{2}$"

exMatch 是一个正则的匹配,格式是 - 分隔的时间,而我们自己设置了新的suffix没有 - 分隔:

loghandle.suffix = '%Y%m%d'
这样就找不到要删除的文件,不会删除相关的日志。

总结

1. 封装好的库,尽量使用公开的接口,不要随便修改内部变量;

2. 代码有问题地,实在找不到原因,可以看下代码。

Python 相关文章推荐
python模拟enum枚举类型的方法小结
Apr 30 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
Python找出9个连续的空闲端口
Feb 01 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
python3.5 email实现发送邮件功能
May 22 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
Mar 05 Python
python tkinter控件布局项目实例
Nov 04 Python
Python 实现opencv所使用的图片格式与 base64 转换
Jan 09 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
Django分页器的用法你都了解吗
May 26 Python
python中的字典使用分享
Jul 31 #Python
Python随机生成数据后插入到PostgreSQL
Jul 28 #Python
python3新特性函数注释Function Annotations用法分析
Jul 28 #Python
python中的格式化输出用法总结
Jul 28 #Python
Python中字符串的常见操作技巧总结
Jul 28 #Python
Python中不同进制的语法及转换方法分析
Jul 27 #Python
深入理解Python装饰器
Jul 27 #Python
You might like
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
js用类封装pop弹窗组件
2017/10/08 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
简单介绍Python中的RSS处理
2015/04/13 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
numpy.where() 用法详解
2019/05/27 Python
python使用requests.session模拟登录
2019/08/09 Python
python中xlrd模块的使用详解
2021/02/01 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
职务说明书范文
2014/05/07 职场文书
室内趣味活动方案
2014/08/24 职场文书
党的群众路线专项整治方案
2014/11/03 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
工作会议通知
2015/04/15 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
经营目标责任书
2015/05/08 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
西游记读书笔记
2015/06/25 职场文书
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA