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实现的一个简单LRU cache
Sep 26 Python
利用Python中的输入和输出功能进行读取和写入的教程
Apr 14 Python
python单元测试unittest实例详解
May 11 Python
Python Web框架Tornado运行和部署
Oct 19 Python
Python之str操作方法(详解)
Jun 19 Python
python 禁止函数修改列表的实现方法
Aug 03 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 Python
python binascii 进制转换实例
Jun 12 Python
python接口自动化框架实战
Dec 23 Python
Python并发编程实例教程之线程的玩法
Jun 20 Python
用Python生成会跳舞的美女
Jan 18 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
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
js常见表单应用技巧
2008/01/09 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
js 轮播效果实例分享
2016/12/28 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
Vue使用localStorage存储数据的方法
2019/05/27 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
详解Python中is和==的区别
2019/03/21 Python
python numpy存取文件的方式
2020/04/01 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
车祸赔偿收入证明
2014/01/09 职场文书
毕业生求职信范文
2014/06/29 职场文书
体育教师求职信
2014/06/30 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
python常见的占位符总结及用法
2021/07/02 Python
Python基本的内置数据类型及使用方法
2022/04/13 Python