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实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
利用Hyperic调用Python实现进程守护
Jan 02 Python
python2.7 json 转换日期的处理的示例
Mar 07 Python
python基础教程项目五之虚拟茶话会
Apr 02 Python
使用django和vue进行数据交互的方法步骤
Nov 11 Python
详解python中各种文件打开模式
Jan 19 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
Jan 23 Python
解决tensorflow添加ptb库的问题
Feb 10 Python
Python3标准库之dbm UNIX键-值数据库问题
Mar 24 Python
在python里使用await关键字来等另外一个协程的实例
May 04 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
使用Python pip怎么升级pip
Aug 11 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
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
图书管理程序(二)
2006/10/09 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
编辑浪子版表单验证类
2007/05/12 Javascript
jsonp原理及使用
2013/10/28 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
python 图片验证码代码
2008/12/07 Python
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
python实现windows下文件备份脚本
2018/05/27 Python
Python异常处理操作实例详解
2018/08/28 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
python里运用私有属性和方法总结
2019/07/08 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
NumPy中的维度Axis详解
2019/11/26 Python
python 如何对logging日志封装
2020/12/02 Python
卫校中专生个人自我评价
2013/09/19 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
2015大学迎新晚会策划书
2015/07/16 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
threejs太阳光与阴影效果实例代码
2022/04/05 Javascript