python logging 日志轮转文件不删除问题的解决方法

项目使用了 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‘
这样就找不到要删除的文件,不会删除相关的日志。

原文地址:https://www.cnblogs.com/tsw123/p/8978790.html

时间: 2024-10-12 17:42:13

python logging 日志轮转文件不删除问题的解决方法的相关文章

python logging 日志轮转文件不删除问题

前言 最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据. 分析 项目使用了 logging 的 TimedRotatingFileHandler : 1 #!/user/bin/env python 2 # -*- coding: utf-8 -*- 3 4 import logging 5 from logging.handlers import TimedRotatingFil

XCode编译文件过多导致内存吃紧解决方法

XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧

centos7 python 中文 “UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte...”解决方法

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128) 1. 开始以为是自己写的python有问题,但后来发现同样的代码在其它电脑上运行正常... 2. 按网上说的方法什么load(sys),或者加# -*- coding: utf-8 -*-的方式,虽说都知道是python2年代的东西.但就当病急乱投医了.结果依旧无效. 3. 怀疑CentOS7 的LAN

ubuntu 中用vim打开txt等文件中文显示乱码的解决方法 &nbsp;

今晚用ubuntu 12.04 的vim编辑网页代码时,发现上面的中文显示乱码.这个html文件是我之前用gedit编辑的,在gedit里面显示正常,可是在vim下显示就是乱码了. 怎么解决ubuntu中vim显示中文乱码的问题呢? 首先,添加中文字符编码: sudo gedit /var/lib/locales/supported.d/local 在打开的文件中添加下面的中文字符集 zh_CN.GBK GBK zh_CN.GB2312 GB2312 zh_CN.GB18030 GB18030

python报错:SyntaxError: Non-ASCII character &#39;\xe5&#39;的解决方法

最近在学习机器学习,上面的代码都是一些python代码,对于python只是会一些基础性的东西,刚才就遇到了一个比较low的问题,但是还是记录一下吧. 在python代码中出现了中文,但是我又把# -*- coding: utf-8 -*-这句话放到了第三行,所以导致出现了,如下的错误: SyntaxError: Non-ASCII character '\xe5' 1. 解决方法也和简单就是把编码的那句话放在第一行: # -*- coding: utf-8 -*- #!/usr/bin/pyt

Visual Studio 打开解决方案后 弹出框显示 &quot;正在打开文件...&quot; 迟迟没反应 的解决方法

Visual Studio 打开解决方案后 弹出框显示 "正在打开文件...",任务管理器的devenv进程又很正常,不会显示"未响应". 而IDE的左下角有个 "正在等待分析完成..." 提示. 刚开始,我以为是VS插件问题,因为我刚安装了一个插件后,重启VS,打开解决方案就出现这个问题了,所以我以为是VS插件问题. 后来我把VS插件通通卸载了,把/ResetAddin /ResetSkipPkgs /ResetSettings 之类的deve

TortoiseSVN文件夹及文件状态图标不显示解决方法

win8 64位系统,原本svn是好用的,安装了klive金山快盘后,svn图标都不显示了.最后通过修改注册表解决: win+R调出运行框,输入regedit,打开注册表编辑器. 将SVN的状态图标排序进行修改,由于快盘用.开头占掉了系统默认状态图标数.因此把每个svn图标前,都加上点.排序就靠前了. 修改后重启系统,图标就全部恢复了. TortoiseSVN文件夹及文件状态图标不显示解决方法

boot目录下文件被删除的简单还原方法

实验环境为boot文件被破坏,所以我先将boot下的文件全部删除 2.删除后我们重启可以看一下出现无法启动的错误,因为开机所用的 文件与boot下的文件都不存在,所以无法正常开机 3.要使得机器可以正常运行,则需要将最基本的开机所需选项恢复,其中包括内核系统,initmafs,与grub文件,首先进入救援模式,利用makeinitrd修复ininmafs 4.这时候我们进入根下的boot查看可以看见init文件已经修复 5.然后就需要修复所需要的vmlinuz,这里有两种方法,第一种是直接可以从

VS2010 未能找到元数据文件(dll)错误解决方法

1.首先查看“错误列表”中报错的项目,然后在“解决方案资源管理器”中找到该项目并查看引用中该错误内容中的dll文件引用是否有问题(是否有黄色感叹号),删除该引用并重新添加该dll文件的引用: 2.操作完成后“重新生成解决方案”,查看问题是否还存在,如果没能解决,请继续……,关闭VS2010开发工具,然后重新打开,再“重新生成解决方案”,一般到这一步问题节本上能够解决: 3.如果问题还是没能解决,那就需要采取终极解决方法——请关闭你的VS2010开发工具,并重新启动电脑,开机后打开VS2010“重