【发布时间】:2018-10-08 19:18:36
【问题描述】:
我每晚都使用 TimedRotatingFileHandler 从日志记录到一个新文件。根据logging docs:
系统将通过附加扩展名来保存旧的日志文件 文件名。
当这种情况发生时,我得到一个权限错误:
--- 记录错误---
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'
我猜这与我有一个运行异步进程的循环有关。但即使我只用一个日志事件测试它,我也会收到权限错误。这意味着它正在尝试更改它正在写入的同一文件的扩展名 - 因此出现权限错误。如何告诉 logger 关闭文件以便它可以将扩展名添加到文件名?
这是我的客户端.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())
【问题讨论】:
-
2 个问题,1. 你的
ProcessPoolExecutor是干什么用的? 2. 我看不到你在哪里更改了记录器文件名,你是否在保存之前关闭并分离了处理程序? -
#1。 ProcessPoolExecutor 用于异步执行多个进程。在这种情况下,这两个进程是 (1) 管理我从 websocket 获取的数据帧和 (2) 发送保持活动消息。 #2。记录器文件名永远不会改变,但在引擎盖下 TimedRotatingFileHandler() 添加了一个扩展名(在午夜),看起来像一个日期(前一个日期)。所以今天的文件总是看起来像 logfile.log 而昨天的看起来像 logfile.2018-10-10
标签: python logging websocket python-asyncio