python多进程下实现日志记录按时间分割
作者:Just_Walking 发布时间:2022-10-07 21:00:24
标签:python,日志分割
python多进程下实现日志记录按时间分割,供大家参考,具体内容如下
原理:自定义日志handler继承TimedRotatingFileHandler,并重写computeRollover与doRollover函数。其中重写computeRollover是为了能按整分钟/小时/天来分割日志,如按天分割,2018-04-10 00:00:00~2018-04-11 00:00:00,是一个半闭半开区间,且不是原意的:从日志创建时间或当前时间开始,到明天的这个时候。
代码如下:
#!/usr/bin/env python
# encoding: utf-8
"""自定义日志处理类"""
import os
import time
from logging.handlers import TimedRotatingFileHandler
class MyLoggingHandler(TimedRotatingFileHandler):
def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None):
TimedRotatingFileHandler.__init__(self, filename, when=when, interval=interval, backupCount=backupCount, encoding=encoding, delay=delay, utc=utc, atTime=atTime)
def computeRollover(self, currentTime):
# 将时间取整
t_str = time.strftime(self.suffix, time.localtime(currentTime))
t = time.mktime(time.strptime(t_str, self.suffix))
return TimedRotatingFileHandler.computeRollover(self, t)
def doRollover(self):
"""
do a rollover; in this case, a date/time stamp is appended to the filename
when the rollover happens. However, you want the file to be named for the
start of the interval, not the current time. If there is a backup count,
then we have to get a list of matching filenames, sort them and remove
the one with the oldest suffix.
"""
if self.stream:
self.stream.close()
self.stream = None
# get the time that this sequence started at and make it a TimeTuple
currentTime = int(time.time())
dstNow = time.localtime(currentTime)[-1]
t = self.rolloverAt - self.interval
if self.utc:
timeTuple = time.gmtime(t)
else:
timeTuple = time.localtime(t)
dstThen = timeTuple[-1]
if dstNow != dstThen:
if dstNow:
addend = 3600
else:
addend = -3600
timeTuple = time.localtime(t + addend)
dfn = self.rotation_filename(self.baseFilename + "." +
time.strftime(self.suffix, timeTuple))
# 修改内容--开始
# 在多进程下,若发现dfn已经存在,则表示已经有其他进程将日志文件按时间切割了,只需重新打开新的日志文件,写入当前日志;
# 若dfn不存在,则将当前日志文件重命名,并打开新的日志文件
if not os.path.exists(dfn):
try:
self.rotate(self.baseFilename, dfn)
except FileNotFoundError:
# 这里会出异常:未找到日志文件,原因是其他进程对该日志文件重命名了,忽略即可,当前日志不会丢失
pass
# 修改内容--结束
# 原内容如下:
"""
if os.path.exists(dfn):
os.remove(dfn)
self.rotate(self.baseFilename, dfn)
"""
if self.backupCount > 0:
for s in self.getFilesToDelete():
os.remove(s)
if not self.delay:
self.stream = self._open()
newRolloverAt = self.computeRollover(currentTime)
while newRolloverAt <= currentTime:
newRolloverAt = newRolloverAt + self.interval
# If DST changes and midnight or weekly rollover, adjust for this.
if (self.when == 'MIDNIGHT' or self.when.startswith('W')) and not self.utc:
dstAtRollover = time.localtime(newRolloverAt)[-1]
if dstNow != dstAtRollover:
if not dstNow: # DST kicks in before next rollover, so we need to deduct an hour
addend = -3600
else: # DST bows out before next rollover, so we need to add an hour
addend = 3600
newRolloverAt += addend
self.rolloverAt = newRolloverAt
说明
第一次修改,如有不妥之处,还请指出,不胜感激。
来源:https://blog.csdn.net/Just_Walking/article/details/79877346


猜你喜欢
- 前言:1、gevent库可以轻松实现并发同步或异步编程。gevent中使用的主要模式是Greenlet,它是以C扩展模块的形式访问Pytho
- 最近在研究python调度框架APScheduler使用的路上,那么今天也算个学习笔记吧!# coding=utf-8""
- 最近在自己写页面,模仿思否论坛,然后写登录注册UI的时候需要一个验证码组件. 去搜一下没找到什么合适的,而且大多都是基于后端的,于是自己手写
- 拿去给自己所思所念之人from turtle import *import timesetup(500, 500, startx=None,
- 前言在我们的日常开发中, 常用的中间件有很多, 今天来讲一下怎么集成限流中间件, 它可以很好地用限制并发访问数来保护系统服务, 避免系统服务
- 本文使用的是163邮件进行测试。注:163邮箱现在需要使用 客户端授权码 进行测试,不再支持邮箱密码进行测试。 
- SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结
- 但是作者Nicholas C. Zakas在【动态原型】方式创建对象的时候没有深究可能会存在的问题和解决方案。而仅仅在继承的时候对【动态原型
- 点阵字体是指根据文字的像素点来显示的字体,效果如下:使用Python读取并显示的过程如下:根据中文字符获取GB2312编码通过GB2312编
- 直接使用word文档已经难不倒大家了,有没有想过用python构建一个word文档写点文章呢?当然这个文章的框架需要我们用代码一点点的建立,
- 最近老师布置了个作业,爬取豆瓣top250的电影信息。按照套路,自然是先去看看源代码了,一看,基本的信息竟然都有,心想这可省事多了。简单分析
- 当存在多个项目的时候,需要同时部署时,且只有一台服务器时,哪么就需要部署Mysql多个实例,原理很简单,多个mysql服务运行使用不同的配置
- python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,th
- 1 包简介1.1 工作空间go语言的工作空间必须由 bin、pkg、src三个目录组成,可以在GOPATH环境变量中添加多个工作空间,但不能
- PyTorch上的常用数据类型如下Data typedtypeCPU tensorGPU tensorSize/bytes32-bit fl
- 在用jupyter notebook写python代码的过程中会产生很多变量,而关闭后或者restart jupyter kernel后所有
- 本文实例为大家分享了JavaScript实现多层颜色选项卡嵌套的具体代码,供大家参考,具体内容如下这是学JavaScript时候的一个作业,
- 本文为大家分享了使用navicat将csv文件导入mysql的具体代码,供大家参考,具体内容如下1.打开navicat,连接到数据库并找到自
- 代码如下:Function getTreeRootId(pNodeId) getSQL = "select note_id,par
- 最近的一个页面中碰到的,本来想用 border 来模拟设计图的虚线效果,但是很明显 border 效果不如设计图来的好看。顺便研究了下 da