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正则表达式介绍
Aug 06 Python
python实现bitmap数据结构详解
Feb 17 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
Apr 24 Python
python实现猜单词小游戏
May 22 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
python3 property装饰器实现原理与用法示例
May 15 Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
解决tensorflow训练时内存持续增加并占满的问题
Jan 19 Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 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获取音频文件的相关信息
2015/06/22 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
JavaScript 动态生成方法的例子
2009/07/22 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
netbeans7安装python插件的方法图解
2013/12/24 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
pytorch 预训练层的使用方法
2019/08/20 Python
Python3分析处理声音数据的例子
2019/08/27 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
Linux面试题LINUX系统类
2014/11/19 面试题
十佳教师事迹材料
2014/01/11 职场文书
小组名称和口号
2014/06/09 职场文书
社区党建工作方案
2014/06/10 职场文书
团结友爱主题班会
2015/08/13 职场文书