python清理日志脚本_自动删除旧的Python日志文件

正如this question中的@MartijnPieters所建议的那样,您可以轻松地扩展FileHandler类来处理自己的删除逻辑。

例如,我的类只保存最后一个“备份计数”文件。在import os

import re

import datetime

import logging

from itertools import islice

class TimedPatternFileHandler(logging.FileHandler):

"""File handler that uses the current time fo the log filename,

by formating the current datetime, according to filename_pattern, using

the strftime function.

If backup_count is non-zero, then older filenames that match the base

filename are deleted to only leave the backup_count most recent copies,

whenever opening a new log file with a different name.

"""

def __init__(self, filename_pattern, mode, backup_count):

self.filename_pattern = os.path.abspath(filename_pattern)

self.backup_count = backup_count

self.filename = datetime.datetime.now().strftime(self.filename_pattern)

delete = islice(self._matching_files(), self.backup_count, None)

for entry in delete:

# print(entry.path)

os.remove(entry.path)

super().__init__(filename=self.filename, mode=mode)

@property

def filename(self):

"""Generate the 'current' filename to open"""

# use the start of *this* interval, not the next

return datetime.datetime.now().strftime(self.filename_pattern)

@filename.setter

def filename(self, _):

pass

def _matching_files(self):

"""Generate DirEntry entries that match the filename pattern.

The files are ordered by their last modification time, most recent

files first.

"""

matches = []

basename = os.path.basename(self.filename_pattern)

pattern = re.compile(re.sub('%[a-zA-z]', '.*', basename))

for entry in os.scandir(os.path.dirname(self.filename_pattern)):

if not entry.is_file():

continue

entry_basename = os.path.basename(entry.path)

if re.match(pattern, entry_basename):

matches.append(entry)

matches.sort(key=lambda e: e.stat().st_mtime, reverse=True)

return iter(matches)

def create_timed_rotating_log(path):

""""""

logger = logging.getLogger("Rotating Log")

logger.setLevel(logging.INFO)

handler = TimedPatternFileHandler('{}_%H-%M-%S.log'.format(path), mode='a', backup_count=5)

logger.addHandler(handler)

logger.info("This is a test!")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值