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  连接字符串(join %)
Sep 06 Python
Python去除字符串两端空格的方法
May 21 Python
Python 中 list 的各项操作技巧
Apr 13 Python
pandas or sql计算前后两行数据间的增值方法
Apr 20 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
Jul 07 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
基于Python获取照片的GPS位置信息
Jan 20 Python
解决python 找不到module的问题
Feb 12 Python
jupyter实现重新加载模块
Apr 16 Python
Python正则表达式如何匹配中文
May 27 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 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 array_values 返回数组的值实例详解
2016/11/17 PHP
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
javascript中new关键字详解
2015/12/14 Javascript
JS hashMap实例详解
2016/05/26 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
JS常见算法详解
2017/02/28 Javascript
js判断是否是手机页面
2017/03/17 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
深入解析Python中的上下文管理器
2016/06/28 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
pytorch简介
2020/11/11 Python
CSS3 实现弹幕的示例代码
2017/08/07 HTML / CSS
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
污水厂厂长岗位职责
2014/01/04 职场文书
syb养殖创业计划书
2014/01/09 职场文书
消防安全检查制度
2014/02/04 职场文书
青年文明号申报材料
2014/12/23 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
Python中22个万用公式的小结
2021/07/21 Python
python利用while求100内的整数和方式
2021/11/07 Python