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自动化构建工具scons使用入门笔记
Mar 10 Python
python根据出生年份简单计算生肖的方法
Mar 27 Python
Python中使用hashlib模块处理算法的教程
Apr 28 Python
Python的Django框架中模板碎片缓存简介
Jul 24 Python
利用python实现数据分析
Jan 11 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
Python开发最牛逼的IDE——pycharm
Aug 01 Python
Python登录系统界面实现详解
Jun 25 Python
Python终端输出彩色字符方法详解
Feb 11 Python
Django model class Meta原理解析
Nov 14 Python
python requests库的使用
Jan 06 Python
python中if和elif的区别介绍
Nov 07 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
React 实现拖拽功能的示例代码
2019/01/06 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
软件工程师面试题
2012/06/25 面试题
师德学习感言
2014/01/31 职场文书
培训主管岗位职责
2014/02/01 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
本溪关门山导游词
2015/02/09 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL