Как использовать встроенное ведение журнала Python с Asyncio (ошибка разрешения) - PullRequest
0 голосов
/ 08 октября 2018

Я использую 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'

Я предполагаю, что это связано с тем, что у меня есть цикл, в котором я запускаю асинхронные процессы.Но даже когда я проверил это только с одним событием регистрации, я получаю ошибку разрешения.Это означает, что он пытается изменить расширение того же файла, в который записывает, - следовательно, ошибка разрешения.Как мне сказать логгеру закрыть файл, чтобы он мог добавить расширение к имени файла?

Это мой client.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 голосов
/ 16 октября 2018

Не думаю, что это имеет какое-либо отношение к asyncio.Вы запустили несколько процессов для обработки вашей рабочей нагрузки.В Windows файл не может быть переименован, если он открыт другим процессом.В целом и даже в POSIX запись в один и тот же файл из нескольких процессов не гарантированно работает должным образом, поскольку у процессов нет механизма сериализации доступа к файлу.Поэтому ответ заключается в том, чтобы иметь отдельный рабочий процесс, который записывает в файл, а другие сообщают ему события через сокет или multiprocessing очередь.См. журнал поваренной книги для получения дополнительной информации.

...