Монолог с системным журналом - одновременные журналы не пишутся правильно - PullRequest
0 голосов
/ 05 ноября 2019

Я использую Monolog 1.25.1 с PHP 7.1 для входа в мою локальную среду, используя SyslogHandler от Monolog для записи записей в поток журнала.

Чтобы проверить, как запись ведет себя в условиях гонки, я создал простой скрипт на python, который порождает 20 потоков, которые одновременно достигают одной из моих конечных точек API:

import requests
from concurrent.futures import ThreadPoolExecutor
from requests.auth import HTTPBasicAuth

def get_url(url):
    return requests.get(url)
with ThreadPoolExecutor(max_workers=20) as pool:
    print(list(pool.map(get_url,["my/api/endpoint"]*20)))

Где-то в конечной точкеобработчик журнала запускается и записывает запись в журнал.

Я должен также упомянуть, что файл настроен на асинхронную запись записей через конфигурацию rsyslog.conf.

Проблема, с которой я столкнулсяявляется то, что не все записи журнала записываются в файл журнала одновременно. Файл журнала содержит 20 записей:

timestamp1;my/api/endpoint;custom_message
message repeated 10 times: [timestamp1;my/api/endpoing;custom_message]
timestamp2;my/api/endpoint;custom_message

Таким образом, файл содержит 12 записей из 20. Теперь, когда я в следующий раз запишу в файл журнала, прежде чем появятся новые записи,остальные 8 добавлены в конец файла:

timestamp1;my/api/endpoint;custom_message
message repeated 10 times: [timestamp1;my/api/endpoing;custom_message]
timestamp2;my/api/endpoint;custom_message
message repeated 8 times: [timestamp2;my/api/endpoing;custom_message]

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

...