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 相关文章推荐
通过数据库向Django模型添加字段的示例
Jul 21 Python
win10环境下python3.5安装步骤图文教程
Feb 03 Python
Python中import机制详解
Nov 14 Python
python查看模块,对象的函数方法
Oct 16 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
利用Django模版生成树状结构实例代码
May 19 Python
Python实现图像的垂直投影示例
Jan 17 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
python实现图片素描效果
Sep 26 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
Python 数据科学 Matplotlib图库详解
Jul 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
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
php开发微信支付获取用户地址
2015/10/04 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
xmlHTTP实例
2006/10/24 Javascript
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
jQuery对象和Javascript对象之间转换的实例代码
2013/03/20 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
vue-cli点击实现全屏功能
2020/03/07 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
python支持断点续传的多线程下载示例
2014/01/16 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
python实现文件的分割与合并
2019/08/29 Python
如何学习Python time模块
2020/06/03 Python
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
汇智创新科技发展有限公司
2015/12/06 面试题
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
体育教师自荐信范文
2013/12/16 职场文书
优秀毕业生自荐信范文
2014/01/01 职场文书
京剧自荐信
2014/01/26 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA