记录旋转 - python和windows

时间:2016-05-24 00:38:04

标签: python windows log-rotation

(我搜索过但没有找到这个问题的副本,但很高兴得到证明)。

我需要从一些Python代码中旋转日志。代码在Windows(Server 2008 R2)上运行。

最初我使用TimedRotatingFileHandler(来自Python的logging.handlers包),但由于我所理解的是它与多处理有关的问题,因此我无法工作(subprocess.check_call用于踢另一个申请。)

我已经检查了ConcurrentLogHandler,看起来它可能会完成这项工作,但我有点担心自2013年以来它没有更新(虽然最近已经提出了问题)。

更新open bug(自2013年起)表明ConcurrentLogHandler无法与Python 2.7 / Windows一起使用。在记录时,代码就会挂起。

我应该使用 Windows 解决方案吗?

3 个答案:

答案 0 :(得分:0)

也许我错过了什么,但Python的日志记录模块附带了RotatingFileHandler

import logging
import time

from logging.handlers import RotatingFileHandler

#----------------------------------------------------------------------
def create_rotating_log(path):
    """
    Creates a rotating log
    """
    logger = logging.getLogger("Rotating Log")
    logger.setLevel(logging.INFO)

    # add a rotating handler
    handler = RotatingFileHandler(path, maxBytes=20,
                                  backupCount=5)
    logger.addHandler(handler)

    for i in range(10):
        logger.info("This is test log line %s" % i)
        time.sleep(1.5)

#----------------------------------------------------------------------
if __name__ == "__main__":
    log_file = r"c:\path\to\test.log"
    create_rotating_log(log_file)

对于Windows 7上的Python 2.7,这对我来说很好。以下是一些更详细的链接:

答案 1 :(得分:0)

好的 - 这就是我最终要做的事情。

因为就日志记录而言,事情只是多线程的(额外的进程不会写入我的日志)我最终动摇了这个。我并不为这种方法感到兴奋 - 创建一个线程锁定对象,关闭日志记录(logging.shutdown - 对此也不感兴趣,因为doco说在程序退出时调用它...),移动文件&再次启动日志记录。然后释放锁。

全部在try / except块中,因此如果出现问题,锁定将被释放。

测试表明这可以满足要求。

在这种情况下调用logging.shutdown会产生一些我不知道的影响吗?!

答案 2 :(得分:0)

SocketHandler 已在原始问题的评论中解决,可从 Python 3.2 获得。

Python 文档还建议使用 {{1}} 将所有日志发送到专用于文件写入过程的套接字服务器。