Парсинг лог файла в динамике и вывод на фронт
Разрабатывается проект на Django. Установлен DRF. В ходе работы одного из процессов Backend-a генерится лог, который необходимо парсить и, выловив нужную строку, вывести на HTML страницу пользователя. Все происходит в динамике.
Вот код, который я написал. urls.py
path('api/log-stream/', LogStreamAPIView.as_view(), name='log_stream'),
Вот часть вьюхи
class LogStreamAPIView(APIView):
def get(self, request):
def stream_log():
f = subprocess.Popen(['tail', '-F', rcvenot_log], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p = select.poll()
p.register(f.stdout)
while TEST_IN_PROGRESS:
if p.poll(0.1):
new_line_log = f.stdout.readline().decode('utf-8').strip()
for target_line in RCV_SCENARIO:
if target_line in new_line_log:
yield f"event: {new_line_log}\n\n"
return StreamingHttpResponse(stream_log(), content_type='text/event-stream')
Вот часть на стороне HTML
<div style="width: 200px; height: 200px; overflow-y: scroll;">
<ul id="logList"></ul>
</div>
<script>
document.addEventListener("DOMContentLoaded", function() {
var logList = document.getElementById('logList');
function updateLog(newLine) {
var listItem = document.createElement('li');
listItem.textContent = newLine;
logList.appendChild(listItem);
}
var source = new EventSource('/api/log-stream/');
source.onmessage = function(event) {
updateLog(event.data);
};
});
</script>
В ходе работы при переходе на mysite.ru/api/log-stream/
я вижу, что строки выдаются,
event: 2024.03.22 16:16:13:016[INFO ][Thread-0] Получено уведомление об изменениях, количество модифицированных элементов - 2
но на странице пользователя они не появляются.
Прошу помочь разобраться в чем может быть проблема.
PS
Я читал что EventSource может быть "чувствителен" к формату данных и ему нужно именно в формате f"event: {new_line_log}\n\n"
или f"data: {new_line_log}\n\n"
. Пробовал и так и так, не работает
PSS Если еще подскажите по поводу проблемы кодировки, буду благодарен. Эту проблему еще не курил.
- Тайна крылась в особенностях обработки запросов DRF. Вот тут описано решение stackoverflow.com/questions/78210488/…. Это решило проблему получения кода 406 и получить нормальный ответ 200.
- Данные необходимо передавать в формате f"data: {data}\n\n." Это требование SSE