Python基于时间的旋转文件处理程序用于记录

时间:2017-08-21 07:21:00

标签: windows python-2.7 logging

使用基于时间的旋转文件处理程序。获取错误

  os.rename('logthred.log', dfn)
  WindowsError: [Error 32] The process cannot access the file because it
  is being used by another process

config:

[loggers]
keys=root

[logger_root]
level=INFO
handlers=timedRotatingFileHandler

[formatters]
keys=timedRotatingFormatter

[formatter_timedRotatingFormatter]
format = %(asctime)s %(levelname)s %(name)s.%(functionname)s:%(lineno)d %
(output)s
datefmt=%y-%m-%d %H:%M:%S

[handlers]
keys=timedRotatingFileHandler

[handler_timedRotatingFileHandler]
class=handlers.TimedRotatingFileHandler
level=INFO
formatter=timedRotatingFormatter
args=('D:\\log.out', 'M', 2, 0, None, False, False)

想要实现基于时间的旋转文件处理程序,多个进程可以编写相同的日志文件。在python中,我没有找到任何可以帮助解决此问题的事情。

我已阅读有关此问题的讨论(python issues)。

任何可以解决此问题的建议。

1 个答案:

答案 0 :(得分:3)

找到解决方案:每当我们创建子进程时,Python 2.7中的问题然后父进程的文件句柄也由子进程继承,因此这会导致错误。我们可以使用此代码阻止此继承。

import sys
from ctypes import windll
import msvcrt
import __builtin__

if sys.platform == 'win32':

    __builtin__open = __builtin__.open

    def __open_inheritance_hack(*args, **kwargs):
        result = __builtin__open(*args, **kwargs)
        handle = msvcrt.get_osfhandle(result.fileno())
        if filename in args:  # which filename handle you don't want to give to child process.
            windll.kernel32.SetHandleInformation(handle, 1, 0)
        return result

   __builtin__.open = __open_inheritance_hack