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基于递归实现电话号码映射功能示例
Apr 13 Python
python基于物品协同过滤算法实现代码
May 31 Python
python实战教程之自动扫雷
Jul 13 Python
Python异常的检测和处理方法
Oct 26 Python
python队列Queue的详解
May 10 Python
Python Process多进程实现过程
Oct 22 Python
python plotly画柱状图代码实例
Dec 13 Python
深入了解python列表(LIST)
Jun 08 Python
Matplotlib.pyplot 三维绘图的实现示例
Jul 28 Python
Django数据模型中on_delete使用详解
Nov 30 Python
基于 Python 实践感知器分类算法
Jan 07 Python
Pandas搭配lambda组合使用详解
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
php生成WAP页面
2006/10/09 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
php实现页面纯静态的实例代码
2017/06/21 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
js格式化时间小结
2014/11/03 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
webpack入门必知必会
2017/01/16 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
vue输入节流,避免实时请求接口的实例代码
2019/10/30 Javascript
深入解析Python中的urllib2模块
2015/11/13 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
python re模块findall()函数实例解析
2018/01/19 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
Python class的继承方法代码实例
2020/02/14 Python
使用Python爬取弹出窗口信息的实例
2020/03/14 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
历史学专业个人的自我评价
2013/10/13 职场文书
护士自我评价
2014/02/01 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python