侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python通过TimedRotatingFileHandler按时间切割日志

Python  /  管理员 发布于 7年前   206

通过TimedRotatingFileHandler按时间切割日志

线上跑了一个定时脚本,每天生成的日志文件都写在了一个文件中。但是日志信息不可能输出到单一的一个文件中。

原因有二:1.日志文件越来越大会影响系统的性能。2.日志文件格式不够清晰,比如我想看今天的日志,不太方便找到的今天的日志信息(即使对日志输出做了时间提示)

通过设置 TimedRotatingFileHandler 进行日志按周(W)、天(D)、时(H)、分(M)、秒(S)切割。

先看一个简单例子:

import timeimport loggingimport osfrom logging import handlersdef _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-8')  th.setFormatter(format_str)  th.setLevel(logging.INFO)  log.addHandler(th)  log.setLevel(level)  return logos.makedirs("./logs", exist_ok=True)logger = _logging(filename='./logs/default.log')if __name__ == '__main__':  while True:    time.sleep(0.1)    logger.info('哈哈哈')

结果如下:

上述代码可以正常运行,而且也可以生成固定的日志个数,但是有一个问题,生成的日志文件格式是你的 文件名+时间 的格式,没有设置时间的话默认设置到了秒(这里是按秒切割)

修改日志格式后缀名称:

# 在上述代码中加入def namer(filename):  return filename.split('default.')th.namer = namer# 设置为S,默认的suffix为 Y-%m-%d_%H-%M-%Sth.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 loggingimport osfrom logging import handlersdef _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-8')  # 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-8')  # th.namer = namer  th.suffix = "%Y-%m-%d.log"  th.setFormatter(format_str)  th.setLevel(logging.INFO)  log.addHandler(th)  log.setLevel(level)  return logos.makedirs('./logs', exist_ok=True)logger = _logging(filename='./logs/default')

总结

以上所述是小编给大家介绍的python通过TimedRotatingFileHandler按时间切割日志,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!


  • 上一条:
    python递归法解决棋盘分割问题
    下一条:
    python递归法实现简易连连看小游戏
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客