5

(我已经搜索并没有找到这个问题的重复项,但很高兴被证明不是这样)。

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

最初我使用TimedRotatingFileHandler(来自 Python 的 logging.handlers 包),但这并不像我们需要的那样工作,因为我知道它与多处理有关(subprocess.check_call 用于启动另一个应用程序)。

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

更新:一个开放的错误(自 2013 年以来)表明 ConcurrentLogHandler 不适用于 Python 2.7/Windows。在记录时,代码只是挂起。

是否有我应该使用的最佳实践Windows解决方案?

4

3 回答 3

0

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

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

这一切都在一个 try/except 块中,因此如果出现问题,锁就会被释放。

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

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

于 2016-06-06T05:27:06.410 回答
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 对我来说效果很好。这里有几个更详细的链接:

于 2016-05-25T21:44:46.730 回答
0

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

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

于 2021-05-26T16:54:48.367 回答