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/ironpython:从入门到精通
Oct 02 Python
Python操作Excel之xlsx文件
Mar 24 Python
Python 文件操作的详解及实例
Sep 18 Python
Python中的并发处理之asyncio包使用的详解
Apr 03 Python
python中的turtle库函数简单使用教程
Jul 23 Python
python实现彩色图转换成灰度图
Jan 15 Python
对Python3 序列解包详解
Feb 16 Python
Python常见数字运算操作实例小结
Mar 22 Python
python 判断一组数据是否符合正态分布
Sep 23 Python
python中实现词云图的示例
Dec 19 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 Python
PyTorch dropout设置训练和测试模式的实现
May 27 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
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
无数据库的详细域名查询程序PHP版(5)
2006/10/09 PHP
PHP中ADODB类详解
2008/03/25 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
模仿百度三维地图的js数据分享
2011/05/12 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
面向对象继承实例(a如何继承b问题)(自写)
2013/07/01 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
nodejs 实现钉钉ISV接入的加密解密方法
2017/01/16 NodeJs
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
JS实现简单打字测试
2020/06/24 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
Python查看微信撤回消息代码
2018/06/07 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
女大学生自我鉴定
2013/12/09 职场文书
《秋姑娘的信》教学反思
2014/02/28 职场文书
客服专员岗位职责
2014/02/28 职场文书
清洁工个人总结
2015/03/04 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
剧场版《转生恶役只好拔除破灭旗标》公开最新视觉图 2023年上映
2022/04/02 日漫