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操作MongoDB数据库的方法示例
Jan 04 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
Python抽象和自定义类定义与用法示例
Aug 23 Python
Pandas过滤dataframe中包含特定字符串的数据方法
Nov 07 Python
python3实现名片管理系统
Nov 29 Python
pandas通过字典生成dataframe的方法步骤
Jul 23 Python
手写一个python迭代器过程详解
Aug 27 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
python3中sys.argv的实例用法
Apr 24 Python
python学习笔记之多进程
Aug 06 Python
python自动生成证件号的方法示例
Jan 14 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 文件上传功能实现代码
2009/06/24 PHP
ThinkPHP写第一个模块应用
2012/02/20 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
PHP7匿名类用法分析
2016/09/26 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
javascript代码加载优化方法
2011/01/30 Javascript
最短的IE判断代码
2011/03/13 Javascript
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
JS的数组迭代方法
2015/02/05 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
layer弹出层取消遮罩的方法
2019/09/25 Javascript
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
Python显示进度条的方法
2014/09/20 Python
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
python多线程下信号处理程序示例
2019/05/31 Python
python五子棋游戏的设计与实现
2019/06/18 Python
python实现串口自动触发工作的示例
2019/07/02 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
新手学python应该下哪个版本
2020/06/11 Python
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
移动通信行业实习自我鉴定
2013/09/28 职场文书
毕业自我评价
2014/02/05 职场文书
局火灾防控工作方案
2014/05/25 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
城管个人总结
2015/02/28 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
公司保洁员管理制度
2015/08/04 职场文书
初三语文教学反思
2016/03/03 职场文书