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中的文件和目录操作实现代码
Mar 13 Python
python模拟新浪微博登陆功能(新浪微博爬虫)
Dec 24 Python
Python中文竖排显示的方法
Jul 28 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
解决pandas 作图无法显示中文的问题
May 24 Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 Python
Python中输入和输出(打印)数据实例方法
Oct 13 Python
详解pyinstaller selenium python3 chrome打包问题
Oct 18 Python
django model通过字典更新数据实例
Apr 01 Python
python同时遍历两个list用法说明
May 02 Python
使用pytorch 筛选出一定范围的值
Jun 28 Python
Python如何输出警告信息
Jul 30 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 magic quotes的详解
2013/06/17 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
vuejs指令详解
2017/02/07 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
Python多线程编程(五):死锁的形成
2015/04/05 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
教师岗位职责
2013/11/17 职场文书
分厂厂长岗位职责
2013/12/29 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
售后服务承诺书
2014/03/26 职场文书
公司合作意向书
2014/04/01 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
小学毕业感言100字
2015/07/30 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技