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获取网页上图片下载地址的方法
Mar 11 Python
使用Python对MySQL数据操作
Apr 06 Python
Python实现统计文本文件字数的方法
May 05 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
django 解决manage.py migrate无效的问题
May 27 Python
opencv python 基于KNN的手写体识别的实例
Aug 03 Python
python多线程并发让两个LED同时亮的方法
Feb 18 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
PyTorch中的拷贝与就地操作详解
Dec 09 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 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验证码生成原理和实现
2016/01/24 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
网上抓的一个特效
2007/05/11 Javascript
用javascript实现给图片加链接
2007/08/15 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
JavaScript浮点数及运算精度调整详解
2016/10/21 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
php中and 和 &amp;&amp;出坑指南
2018/07/13 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
Python如何读取MySQL数据库表数据
2017/03/11 Python
Python实现的下载网页源码功能示例
2017/06/13 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
python表格存取的方法
2018/03/07 Python
python指定写入文件时的编码格式方法
2018/06/07 Python
python属于哪种语言
2020/08/16 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
党员教师工作决心书
2014/03/13 职场文书
学校标语大全
2014/06/19 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
创业计划书之面包店
2019/09/12 职场文书
MYSQL如何查看进程和kill进程
2022/03/13 MySQL
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记
golang为什么要统一错误处理
2022/04/03 Golang