zoukankan      html  css  js  c++  java
  • 实际应用中遇到TimedRotatingFileHandler不滚动的问题

    需求:

    程序每天晚上8点和10点定时运行,期望日志按日期记录

    添加Handler部分代码如下:

    formatter = logging.Formatter("%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s", "%Y-%m-%d %H:%M:%S")
    log_file_handler = logging.handlers.TimedRotatingFileHandler(filename="loaddata.log", when="D", interval=1, backupCount=30)
    log_file_handler.setFormatter(formatter)
    logging.getLogger().addHandler(log_file_handler)

    查看过很多资料,代码并没有问题

    现象:

    只有一个日志(loaddata.log)文件被生成,其中会有所有天的日志,期望的loaddata.log.YYYY-mm-dd并没有看到

    研究:

    追查代码,看到handlers.py(Python自带模块)中是这样计算日志文件重新生成时间的

    下面的 result 是下一次rollover的时间,上面的 t 是handler初始化时获取的起始时间。

    可以看到logging模块得到的结果是这样的:

    • 起始时间 = 日志文件的最后修改时间
    • 下次滚动时间 = 起始时间 + 1天(因为我设置的when='D')

    又因为,我每天要在20点和22点各执行一次,并且每次都有日志写入。因此:

    • 20点执行时,起始时间 = 昨天晚上22点;下次滚动时间 = 昨天22点 + 1天 = 今天22点。所以不滚动
    • 22点执行时,起始时间 = 今天20点;下次滚动时间 = 今天20点 + 1天 = 明天20点。所以不滚动

    所以:导致的结果就是。。。永远不滚动!/(ㄒoㄒ)/~~

    解决办法:

    创建Handler时,把when='D'改成when='MIDNIGHT'可解决这个问题。因为MIDNIGHT指的是,只要过了0点就会滚动。

  • 相关阅读:
    vi删除前n个字符
    ubuntu自定义登录session和桌面环境
    linux出错处理
    获取用户id
    c关键字控制语句运算符小结
    红帽Linux启动流程详解
    C语言中的文本流与二进制流的区别
    c简单排序字符串
    linux挂载磁盘优盘
    strcpy之段错误
  • 原文地址:https://www.cnblogs.com/qhlblog/p/7998454.html
Copyright © 2011-2022 走看看