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字符串格式化输出方法分析
Apr 13 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
Python3实现发送QQ邮件功能(html)
Dec 15 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
pandas分别写入excel的不同sheet方法
Dec 11 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 Python
Django框架使用mysql视图操作示例
May 15 Python
python机器学习包mlxtend的安装和配置详解
Aug 21 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
Python 爬取必应壁纸的实例讲解
Feb 24 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
python 可视化库PyG2Plot的使用
Jan 21 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
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
javaScript面向对象继承方法经典实现
2013/08/20 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
js实现开关灯效果
2020/03/30 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
使用Python来开发微信功能
2018/06/13 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
Python脚本按照当前日期创建多级目录
2019/03/01 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
行政经理岗位职责
2013/11/09 职场文书
企业总经理岗位职责
2014/02/13 职场文书
预备党员公开承诺书
2014/05/28 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
学校会议通知范文
2015/04/15 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
导游词之井冈山
2019/11/20 职场文书
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android
mybatis 获取更新记录的id
2022/05/20 Java/Android