我每天晚上都使用TimedRotatingFileHandler从日志记录到新文件。根据{{3}}:
系统将通过在扩展名后附加扩展名来保存旧的日志文件。 文件名。
正是这种情况发生时,我出现了权限错误:
---记录错误---
PermissionError:[WinError 32]进程无法访问文件 因为它正在被另一个进程使用: 'C:\ Users \ lh \ PythonIntegration \ Connect \ Logs \ WS_API_integration_client' ->'C:\ Users \ lh \ PythonIntegration \ Connect \ Logs \ WS_API_integration_client.2018-10-08_13-00'
我猜想这与我运行异步进程的循环有关。但是,即使我仅使用一个日志记录事件对其进行了测试,我仍然会得到权限错误。这意味着它正在尝试更改要写入的文件的扩展名-因此出现权限错误。如何告诉记录器关闭文件,以便它可以将扩展名添加到文件名中?
这是我的客户。py
rotating_logger = logging.getLogger('ClientLogger')
rotating_logger.setLevel(logging.DEBUG)
handler = logging.handlers.TimedRotatingFileHandler(
log_file, when = 'midnight',backupCount=30)
formatter = logging.Formatter(fmt='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
handler.setFormatter(formatter)
rotating_logger.addHandler(handler)
async def keep_alive(websocket):
"""
Sends keep-alive message to the server.
"""
while websocket.open:
await websocket.send('hello')
await asyncio.sleep(60*1)
async def open_connection():
loop = asyncio.get_event_loop()
with concurrent.futures.ProcessPoolExecutor() as pool:
async with websockets.connect(
'wss://{}:{}@host.net/api/ws'.format(user,pswd),
ssl=True,
max_queue = 1000) as websocket:
"""
Keep connection alive.
"""
asyncio.ensure_future(keep_alive(websocket))
"""
Handle messages from server
"""
while True:
"""
Handle message from server.
"""
message = await websocket.recv()
if message.isdigit():
rotating_logger.info ('Keep alive message: {}'.format(str(message)))
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(open_connection())
答案 0 :(得分:1)
我认为与asyncio
没有任何关系。您已经启动了多个流程来处理您的工作量。在Windows下,文件被其他进程打开时无法重命名。通常,即使在POSIX下,也不能保证从多个进程写入同一文件不会像预期的那样工作,因为进程没有机制来序列化对文件的访问。因此,答案是要有一个单独的工作进程来写入文件,而其他进程则通过套接字或multiprocessing
队列将事件传递给该文件。有关更多信息,请参见logging cookbook。