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操作Excel之xlsx文件
Mar 24 Python
python读取和保存图片5种方法对比
Sep 12 Python
python按时间排序目录下的文件实现方法
Oct 17 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
Nov 30 Python
Python mutiprocessing多线程池pool操作示例
Jan 30 Python
selenium+python环境配置教程详解
May 28 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
python绘制多个子图的实例
Jul 07 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
python 下载文件的几种方式分享
Apr 07 Python
基于tensorflow权重文件的解读
May 26 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
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
apache php模块整合操作指南
2012/11/16 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
PHP+mysql实现的三级联动菜单功能示例
2019/02/15 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
js tab 选项卡
2009/04/26 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
跟老齐学Python之模块的加载
2014/10/24 Python
python使用Queue在多个子进程间交换数据的方法
2015/04/18 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
Python实现Event回调机制的方法
2019/02/13 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
浅析Python 责任链设计模式
2020/09/11 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
后勤园长自我鉴定
2013/10/17 职场文书
学前教育毕业生自荐信范文
2013/12/24 职场文书
幼儿园教师培训方案
2014/02/04 职场文书
英语系本科生求职信
2014/07/15 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书
小学中队长竞选稿
2015/11/20 职场文书