python多进程下实现日志记录按时间分割


Posted in Python onJuly 22, 2019

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

说明

第一次修改,如有不妥之处,还请指出,不胜感激。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取一组数据里最大值max函数用法实例
May 26 Python
python中PIL安装简单教程
Apr 21 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
Python实现简单生成验证码功能【基于random模块】
Feb 10 Python
python+opencv识别图片中的圆形
Mar 25 Python
使用实现pandas读取csv文件指定的前几行
Apr 20 Python
python使用Qt界面以及逻辑实现方法
Jul 10 Python
python for循环remove同一个list过程解析
Aug 14 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
python模拟斗地主发牌
Apr 22 Python
python3处理word文档实例分析
Dec 01 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 #Python
python实现日志按天分割
Jul 22 #Python
python re.sub()替换正则的匹配内容方法
Jul 22 #Python
简单了解python gevent 协程使用及作用
Jul 22 #Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 #Python
python+logging+yaml实现日志分割
Jul 22 #Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 #Python
You might like
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
两种php调用Java对象的方法
2006/10/09 PHP
php 代码优化之经典示例
2011/03/24 PHP
使用php批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
php命令行写shell实例详解
2018/07/19 PHP
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
Python随机数random模块使用指南
2016/09/09 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
中专毕业生自我鉴定
2014/02/02 职场文书
小学生元旦广播稿
2014/02/21 职场文书
校企合作协议书
2014/04/16 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
党员个人年度总结
2015/02/14 职场文书