(我搜索过但没有找到这个问题的副本,但很高兴得到证明)。
我需要从一些Python代码中旋转日志。代码在Windows(Server 2008 R2)上运行。
最初我使用TimedRotatingFileHandler
(来自Python的logging.handlers包),但由于我所理解的是它与多处理有关的问题,因此我无法工作(subprocess.check_call用于踢另一个申请。)
我已经检查了ConcurrentLogHandler,看起来它可能会完成这项工作,但我有点担心自2013年以来它没有更新(虽然最近已经提出了问题)。
更新:open bug(自2013年起)表明ConcurrentLogHandler无法与Python 2.7 / Windows一起使用。在记录时,代码就会挂起。
我应该使用 Windows 解决方案吗?
答案 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}} 将所有日志发送到专用于文件写入过程的套接字服务器。