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实现的防DDoS脚本
Feb 08 Python
python和pyqt实现360的CLable控件
Feb 21 Python
在Python中使用SimpleParse模块进行解析的教程
Apr 11 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
在服务器上安装python3.8.2环境的教程详解
Apr 26 Python
python3爬虫中异步协程的用法
Jul 10 Python
python 用pandas实现数据透视表功能
Dec 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生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
php简单统计中文个数的方法
2016/09/30 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
Python整型运算之布尔型、标准整型、长整型操作示例
2017/07/21 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
python向图片里添加文字
2019/11/26 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
keras中的History对象用法
2020/06/19 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
大学自我鉴定
2013/12/20 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
高二数学教学反思
2016/02/18 职场文书
AJAX学习笔记
2021/05/18 Javascript