Heim > Artikel > Backend-Entwicklung > Entwickeln Sie ein System, das eine Protokolldatei auf einem Remote-Server überwacht, ähnlich dem Unix-Befehl tail -f.
Das Ziel dieses Problems ist:
Das Ziel besteht darin, ein System zu entwickeln, das eine Protokolldatei überwacht, die sich auf einem Remote-Server befindet, ähnlich dem Unix-Befehl tail -f. Die Protokolldatei wird fortlaufend mit neuen Daten ergänzt. Dieses System sollte bestehen aus:
Eine Serveranwendung, die die laufenden Änderungen an einer bestimmten Protokolldatei auf demselben Server verfolgt. Diese Anwendung sollte in der Lage sein, die neu hinzugefügten Daten in Echtzeit an Clients zu übertragen.
Eine webbasierte Client-Schnittstelle, die über eine URL (z. B. http://localhost/log) erreichbar ist und die Protokolldateiaktualisierungen dynamisch anzeigt, sobald sie auftreten, ohne dass der Benutzer die Seite neu laden muss. Beim Besuch der Seite sollten Benutzer zunächst die letzten 10 Zeilen aus der Protokolldatei sehen.
Außerdem wurden die folgenden Szenarien behandelt:
Der Server muss Aktualisierungen aktiv an die Clients weiterleiten, um minimale Verzögerungen zu gewährleisten und möglichst zeitnahe Aktualisierungen zu erreichen.
Da die Protokolldatei möglicherweise sehr groß ist (möglicherweise mehrere Gigabyte), müssen Sie eine Strategie entwickeln, um die letzten 10 Zeilen effizient abzurufen, ohne die gesamte Datei zu verarbeiten.
Der Server sollte nur neue Ergänzungen der Datei an die Clients übertragen, anstatt die Datei vollständig erneut zu senden.
Es ist wichtig, dass der Server gleichzeitige Verbindungen von mehreren Clients ohne Leistungseinbußen unterstützt.
Die Webseite des Kunden sollte sofort geladen werden, ohne nach der ersten Anfrage im Ladezustand zu bleiben, und es sollte kein Neuladen erforderlich sein, um neue Updates anzuzeigen.
Ich habe eine Flask-Anwendung mit einer einfachen Benutzeroberfläche erstellt, die die letzten 10 Nachrichten anzeigt.
Ich habe den Flask-Socketio verwendet, um eine Verbindung herzustellen. Außerdem habe ich einige grundlegende Konzepte für den Umgang mit Dateien wie fileObj.seek(), fileObj.tell() usw. verwendet.
from flask import Flask, render_template from flask_socketio import SocketIO, emit from threading import Lock app = Flask(__name__) socketio = SocketIO(app) thread = None thread_lock = Lock() LOG_FILE_PATH = "./static/client.txt" last_position = 0 position_lock = Lock() @app.route('/') def index(): return render_template('index.html') @socketio.on('connect') def test_connect(): global thread with thread_lock: if thread is None: print("started execution in background!") thread = socketio.start_background_task(target=monitor_log_file) def monitor_log_file(): global last_position while True: try: with open(LOG_FILE_PATH, 'rb') as f: f.seek(0, 2) file_size = f.tell() if last_position != file_size: buffer_size = 1024 if file_size < buffer_size: buffer_size = file_size f.seek(-buffer_size, 2) lines = f.readlines() last_lines = lines[-10:] content = b'\n'.join(last_lines).decode('utf-8') socketio.sleep(1) # Add a small delay to prevent high CPU usage socketio.emit('log_updates', {'content': content}) print("Emitted new Lines to Client!") last_position = file_size else: pass except FileNotFoundError: print(f"Error: {LOG_FILE_PATH} not found.") except Exception as e: print(f"Error while reading the file: {e}") if __name__ == '__main__': socketio.run(app, debug=True, log_output=True, use_reloader=False)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Basics</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.5.4/socket.io.js"></script> </head> <body> <h1>User Updated Files Display it over here:</h1> <div id="output"></div> <script> var socket = io("http://127.0.0.1:5000"); socket.on('connect', function() { console.log('Connected to the server'); }); socket.on('disconnect', function() { console.log('Client disconnected'); }); socket.on('log_updates', function(data) { console.log("data", data); var div = document.getElementById('output'); var lines = data.content.split('\n'); div.innerHTML = ''; lines.forEach(function(line) { var p = document.createElement('p'); p.textContent = line; div.appendChild(p); }); }); </script> </body> </html>
Erstellen Sie außerdem eine client.log-Datei im statischen Ordner in der Flask-Anwendung.
Bitte korrigieren Sie mich gerne, wenn ich etwas falsch gemacht habe. Kommentieren Sie unten mit eventuellen Korrekturen!
Das obige ist der detaillierte Inhalt vonEntwickeln Sie ein System, das eine Protokolldatei auf einem Remote-Server überwacht, ähnlich dem Unix-Befehl tail -f.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!