Отображение содержимого файла журнала по мере его обновления.

У меня есть внешние программы, такие как ffmpeg и gstreamer, работающие в фоновом режиме, и запись в файл журнала. Я хочу отобразить содержимое этого журнала в моем приложении Flask, чтобы пользователь мог наблюдать за обновлением журнала, например tail -f job.log будет делать в терминале.

Я попытался использовать <object data="/out.log" type="text/plain"> чтобы указать на файл журнала, но это не отображало данные, или браузер сказал мне, что мне нужен плагин.

Как я могу вставлять и обновлять файл журнала на странице HTML?

Ответ 1

Используйте представление "Флажок" для непрерывного чтения из файла навсегда и потока ответа. Используйте JavaScript для чтения из потока и обновления страницы. Этот пример отправляет весь файл, вы можете усечь его в какой-то момент, чтобы сохранить пропускную способность и память. Этот пример спит между чтениями, чтобы уменьшить нагрузку процессора из бесконечного цикла и разрешить другим потокам более активное время.

from time import sleep
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/stream')
def stream():
    def generate():
        with open('job.log') as f:
            while True:
                yield f.read()
                sleep(1)

    return app.response_class(generate(), mimetype='text/plain')

app.run()
<pre id="output"></pre>
<script>
    var output = document.getElementById('output');

    var xhr = new XMLHttpRequest();
    xhr.open('GET', '{{ url_for('stream') }}');
    xhr.send();

    setInterval(function() {
        output.textContent = xhr.responseText;
    }, 1000);
</script>

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

Ответ 2

Я использую пакет frontail от npm.

npm i frontail -g
frontail /var/log/syslog

посетите http://127.0.0.1:9001, чтобы просмотреть журналы

Источник: https://github.com/mthenw/frontail

Это может быть не точный ответ на вопрос (для встраивания html-страницы), но он решает проблему многих пользователей, которые смотрят конкретно только для

Отображение содержимого файла журнала по мере его обновления.