python - 如何使用 Python 的内置 Logging with Asyncio(权限错误)
问题描述
我每晚都使用 TimedRotatingFileHandler 从日志记录到一个新文件。根据日志记录文档:
系统将通过将扩展名附加到文件名来保存旧的日志文件。
发生这种情况时,我会收到权限错误:
--- 记录错误 ---
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())
解决方案
我不认为这与asyncio
. 您已经启动了多个进程来处理您的工作量。在 Windows 下,文件被另一个进程打开时不能重命名。通常,即使在 POSIX 下,也不能保证从多个进程写入同一个文件按预期工作,因为这些进程没有序列化对文件的访问的机制。所以答案是有一个单独的工作进程写入文件,其他人通过套接字或multiprocessing
队列向它传递事件。有关详细信息,请参阅日志记录手册。
推荐阅读
- pytest - 如何使用 pytest-html 在 HTML 中嵌入 base64 图像?
- customization - Acumatica 通用查询添加到查询菜单(自动化步骤)
- c++ - 玩家移动和碰撞之间的交互问题
- machine-learning - sklearn 的 cross_val_score 函数需要澄清
- spring-mvc - 在spring mvc中获取带有模型字段的文件
- php - angular.callbacks 到字符串 PHP?
- javascript - 无法模拟用于 react-inlinesvg Jest 测试的图标
- ip - 欧洲的GCE VM拥有美国IP
- css - 修复了 chrome 67 的 CSS 背景附件
- c++ - GetLogicalProcessorInformationEx SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX 数组大小