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多线程抓取天涯帖子内容示例
Apr 03 Python
python两种遍历字典(dict)的方法比较
May 29 Python
python删除过期文件的方法
May 29 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
django 发送手机验证码的示例代码
Apr 25 Python
Python多线程处理实例详解【单进程/多进程】
Jan 30 Python
Python常用的json标准库
Feb 19 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
Django admin禁用编辑链接和添加删除操作详解
Nov 15 Python
Python线程指南分享
Nov 19 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 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
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
2021/02/18 Vue.js
使用Python的PIL模块来进行图片对比
2016/02/18 Python
python实现图片筛选程序
2018/10/24 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
Python3 Click模块的使用方法详解
2020/02/12 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
Python map及filter函数使用方法解析
2020/08/06 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
全神贯注教学反思
2014/02/03 职场文书
《云雀的心愿》教学反思
2014/02/25 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电