我设置了记录器处理程序,然后启动了chrome webdriver。尝试旋转日志文件时会出现[错误32],因为它无法重命名日志文件。我发现Chrome会打开日志文件。
我更改了设置记录器的顺序并启动了chrome webdriver.It将成功旋转日志文件。当我的脚本重新启动chrome时,错误再次发生。我每次启动时都必须设置logger.handlers = []新的chrome webdriver实例。
我尝试 - 禁用日志记录,但它不起作用。
为什么chrome.exe会打开python logging filehandler的日志文件?
是否有任何解决方案可以避免chrome打开日志文件?
这是我的剧本。
import time
import logging
from selenium import webdriver
from logging.handlers import TimedRotatingFileHandler
logger = logging.getLogger('m')
def set_logger():
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
rotate_file_handler = TimedRotatingFileHandler('D:\\data\\spam.log',
when='s', interval=10, backupCount=10)
rotate_file_handler.setLevel(logging.INFO)
rotate_file_handler.setFormatter(formatter)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(formatter)
logger.addHandler(rotate_file_handler)
logger.addHandler(console_handler)
if __name__ == '__main__':
# change the order these two, it will work correct.
# or set logger.handlers = [], it will work too.
set_logger()
b = webdriver.Chrome()
for i in range(100):
logger.info(i)
time.sleep(1)
这是Traceback。(Windows 7 SP1 x86_64,python = 2.7.10,chrome = 43.0.2357.81,chromedriver = 2.15.322448)。
Traceback (most recent call last):
File "C:\Python27\lib\logging\handlers.py", line 77, in emit
self.doRollover()
File "C:\Python27\lib\logging\handler.py", line 350, in doRollover
os.rename(self.baseFilename, dfn)
WindowsError: [Error 32]
Logged from test.py, line 28
答案 0 :(得分:0)
我今天遇到了同样的问题。经过一番挖掘,我发现了问题所在。
问题的根本原因在于python本身。在3.4版(包括2.x早午餐)之前,python默认情况下会创建可继承的文件描述符(据我所知,它几乎适用于所有与文件相关的操作),并且用户无法更改此行为。当selenium chromedriver通过子进程调用webdriver.exe时,日志文件处理程序将由webdriver进程继承,这将阻止日志记录翻转操作并导致错误。
根据pep-0446,此问题在3.4版中已解决。
看来,解决此问题的唯一方法是升级到python 3.4或更高版本。对于python 2.7早午餐,似乎此问题已标记为“无法解决”状态,请参见issue26769。
脚本的一种解决方法是避免使用TimedRotatingFileHandler,这样它就不会旋转并触发错误。