如何在Asyncio中使用Python的内置日志记录(权限错误)

时间:2018-10-08 19:18:36

标签: python logging websocket python-asyncio

我每天晚上都使用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())

1 个答案:

答案 0 :(得分:1)

我认为与asyncio没有任何关系。您已经启动了多个流程来处理您的工作量。在Windows下,文件被其他进程打开时无法重命名。通常,即使在POSIX下,也不能保证从多个进程写入同一文件不会像预期的那样工作,因为进程没有机制来序列化对文件的访问。因此,答案是要有一个单独的工作进程来写入文件,而其他进程则通过套接字或multiprocessing队列将事件传递给该文件。有关更多信息,请参见logging cookbook