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 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
python基础教程之五种数据类型详解
Jan 12 Python
Python命令启动Web服务器实例详解
Feb 23 Python
Django自定义插件实现网站登录验证码功能
Apr 19 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
python进阶之自定义可迭代的类
Aug 20 Python
Python for循环及基础用法详解
Nov 08 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
python 绘制正态曲线的示例
Sep 24 Python
python中字符串的编码与解码详析
Dec 03 Python
python利用proxybroker构建爬虫免费IP代理池的实现
Feb 21 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 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数组总结篇(一)
2008/09/30 PHP
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
PHP开发注意事项总结
2015/02/04 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
js实现全选和全不选
2020/07/28 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
python中定义结构体的方法
2013/03/04 Python
Python的垃圾回收机制深入分析
2014/07/16 Python
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
Python的Django框架中的Context使用
2015/07/15 Python
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
Python 复平面绘图实例
2019/11/21 Python
Python partial函数原理及用法解析
2019/12/11 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
外企求职信范文分享
2013/12/31 职场文书
教师旷工检讨书
2014/01/18 职场文书
2014年督导工作总结
2014/11/19 职场文书
大学生村官入党自传
2015/06/26 职场文书
职工的安全责任书范文!
2019/07/02 职场文书