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获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
Aug 16 Python
Python中的 is 和 == 以及字符串驻留机制详解
Jun 28 Python
Django中提供的6种缓存方式详解
Aug 05 Python
django中使用POST方法获取POST数据
Aug 20 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
解决pytorch报错:AssertionError: Invalid device id的问题
Jan 10 Python
Python2.6版本pip安装步骤解析
Aug 17 Python
python selenium xpath定位操作
Sep 01 Python
Python QT组件库qtwidgets的使用
Nov 02 Python
pycharm + django跨域无提示的解决方法
Dec 06 Python
Python快速优雅的批量修改Word文档样式
May 20 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
php 无法载入mysql扩展
2010/03/12 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
JQuery 常用操作代码
2010/03/14 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
微信小程序实现城市列表选择
2018/06/05 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
Python采用Django开发自己的博客系统
2020/09/29 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
Python文件读写常见用法总结
2019/02/22 Python
django用户登录验证的完整示例代码
2019/07/21 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
护理学毕业生求职信
2013/11/14 职场文书
三年级评语大全
2014/04/23 职场文书
2015年保管员工作总结
2015/04/30 职场文书
出生证明范本
2015/06/15 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
python实现A*寻路算法
2021/06/13 Python
Feign调用传输文件异常的解决
2021/06/24 Java/Android
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL