python通过TimedRotatingFileHandler按时间切割日志

  • 时间:
  • 浏览:35

经由过程TimedRotatingFileHandler定时间切割日记

线上跑了1个按时剧本,天天死成的日记文件皆写正在了1个文件中。可是日记疑息不成能输入到单1的1个文件中。

缘由有2:1.日记文件愈来愈年夜会影响体系的机能。2.日记文件格局不敷明晰,好比我念看明天的日记,没有太便利找到的明天的日记疑息(即便对日记输入做了工夫提醒)

经由过程设置 TimedRotatingFileHandler 停止日记按周(W)、天(D)、时(H)、分(M)、秒(S)切割。

先看1个简朴例子:

import time
import logging
import os
from logging import handlers
def _logging(**kwargs):
  level = kwargs.pop('level', None)
  filename = kwargs.pop('filename', None)
  datefmt = kwargs.pop('datefmt', None)
  format = kwargs.pop('format', None)
  if level is None:
    level = logging.DEBUG
  if filename is None:
    filename = 'default.log'
  if datefmt is None:
    datefmt = '%Y-%m-%d %H:%M:%S'
  if format is None:
    format = '%(asctime)s [%(module)s] %(levelname)s [%(lineno)d] %(message)s'
  log = logging.getLogger(filename)
  format_str = logging.Formatter(format, datefmt)
  # backupCount 保留日记的数目,过时主动删除
  # when 按甚么日期格局切分(那里便利测试利用的秒)
  th = handlers.TimedRotatingFileHandler(filename=filename, when='S', backupCount=3, encoding='utf⑻')
  th.setFormatter(format_str)
  th.setLevel(logging.INFO)
  log.addHandler(th)
  log.setLevel(level)
  return log
os.makedirs("./logs", exist_ok=True)
logger = _logging(filename='./logs/default.log')
if __name__ == '__main__':
  while True:
    time.sleep(0.1)
    logger.info('哈哈哈')

成果以下:

上述代码能够一般运转,并且也能够死成牢固的日记个数,可是有1个成绩,死成的日记文件格局是您的 文件名+工夫 的格局,出有设置工夫的话默许设置到了秒(那里是按秒切割)

修正日记格局后缀称号:

# 正在上述代码中参加
def namer(filename):
  return filename.split('default.')
th.namer = namer
# 设置为S,默许的suffix为 Y-%m-%d_%H-%M-%S
th.suffix = "%Y-%m-%d_%H-%M-%S.log"
# 为了看的更视觉结果,能够显现正在掌握台容许
cmd = logging.StreamHandler()
cmd.setFormatter(format_str)
cmd.setLevel(level)
log.addHandler(cmd)

运转成果:


名字仿佛能够了,可是日记仿佛出有起到主动删除的目标啊,并且也出正在之前的log文件夹了。

去看看源码

def getFilesToDelete(self):
    """
    Determine the files to delete when rolling over.

    More specific than the earlier method, which just used glob.glob().
    """
    dirName, baseName = os.path.split(self.baseFilename)
    fileNames = os.listdir(dirName)
    result = []
    prefix = baseName + "."
    plen = len(prefix)
    for fileName in fileNames:
      if fileName[:plen] == prefix:
        suffix = fileName[plen:]
        if self.extMatch.match(suffix):
          result.append(os.path.join(dirName, fileName))
    if len(result) < self.backupCount:
      result = []
    else:
      result.sort()
      result = result[:len(result) - self.backupCount]
    return result

那是它的删除逻辑,枢纽是经由过程 . 后面的字段判定是不是反复,当有特定的反复数后起头删除。

以是成绩去了,要末本身来重写源码,要末便只能用 default.日期.log 这类格局了。

附上日常平凡利用的日记代码

import logging
import os
from logging import handlers
def _logging(**kwargs):
  level = kwargs.pop('level', None)
  filename = kwargs.pop('filename', None)
  datefmt = kwargs.pop('datefmt', None)
  format = kwargs.pop('format', None)
  if level is None:
    level = logging.DEBUG
  if filename is None:
    filename = 'default.log'
  if datefmt is None:
    datefmt = '%Y-%m-%d %H:%M:%S'
  if format is None:
    format = '%(asctime)s [%(module)s] %(levelname)s [%(lineno)d] %(message)s'
  log = logging.getLogger(filename)
  format_str = logging.Formatter(format, datefmt)
  def namer(filename):
    return filename.split('default.')[1]
  # cmd = logging.StreamHandler()
  # cmd.setFormatter(format_str)
  # cmd.setLevel(level)
  # log.addHandler(cmd)
  os.makedirs("./debug/logs", exist_ok=True)
  th_debug = handlers.TimedRotatingFileHandler(filename="./debug/" + filename, when='D', backupCount=3,
                         encoding='utf⑻')
  # th_debug.namer = namer
  th_debug.suffix = "%Y-%m-%d.log"
  th_debug.setFormatter(format_str)
  th_debug.setLevel(logging.DEBUG)
  log.addHandler(th_debug)
  th = handlers.TimedRotatingFileHandler(filename=filename, when='D', backupCount=3, encoding='utf⑻')
  # th.namer = namer
  th.suffix = "%Y-%m-%d.log"
  th.setFormatter(format_str)
  th.setLevel(logging.INFO)
  log.addHandler(th)
  log.setLevel(level)
  return log
os.makedirs('./logs', exist_ok=True)
logger = _logging(filename='./logs/default')

总结

以上所述是小编给各人引见的Python经由过程TimedRotatingFileHandler定时间切割日记,期望对各人有所帮忙,若是各人有任何疑问请给我留行,小编会实时复兴各人的。正在此也十分感激各人对剧本之家网站的撑持!
若是您以为本文对您有帮忙,欢送转载,烦请说明出处,开开!