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基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
Python生成随机验证码的两种方法
Dec 22 Python
解析Python中的__getitem__专有方法
Jun 27 Python
Python模块结构与布局操作方法实例分析
Jul 24 Python
Python读写zip压缩文件的方法
Aug 29 Python
简单谈谈python基本数据类型
Sep 26 Python
python tkinter窗口最大化的实现
Jul 15 Python
python psutil模块使用方法解析
Aug 01 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
Python3爬虫里关于Splash负载均衡配置详解
Jul 10 Python
python pandas dataframe 去重函数的具体使用
Jul 20 Python
教你使用一行Python代码玩遍童年的小游戏
Aug 23 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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
2014/11/29 PHP
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
chrome调试javascript详解
2015/10/21 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
详解python的几种标准输出重定向方式
2016/08/15 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
Python urls.py的三种配置写法实例详解
2017/04/28 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
三星印度官网:Samsung印度
2019/08/03 全球购物
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
渔夫的故事教学反思
2014/02/14 职场文书
cf搞笑广告词
2014/03/14 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
创先争优宣传标语
2014/10/08 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
庆六一开幕词
2015/01/29 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
你知道Java Spring的两种事务吗
2022/03/16 Java/Android
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers