Heim > Backend-Entwicklung > Python-Tutorial > Entwickeln Sie ein System, das eine Protokolldatei auf einem Remote-Server überwacht, ähnlich dem Unix-Befehl tail -f.

Entwickeln Sie ein System, das eine Protokolldatei auf einem Remote-Server überwacht, ähnlich dem Unix-Befehl tail -f.

Barbara Streisand
Freigeben: 2024-09-28 22:11:02
Original
848 Leute haben es durchsucht

Develop a system that monitors a log file located on a remote server, similar to the Unix command 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:

  1. 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.

  2. 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:

  3. Der Server muss Aktualisierungen aktiv an die Clients weiterleiten, um minimale Verzögerungen zu gewährleisten und möglichst zeitnahe Aktualisierungen zu erreichen.

  4. 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.

  5. Der Server sollte nur neue Ergänzungen der Datei an die Clients übertragen, anstatt die Datei vollständig erneut zu senden.

  6. Es ist wichtig, dass der Server gleichzeitige Verbindungen von mehreren Clients ohne Leistungseinbußen unterstützt.

  7. 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)

Nach dem Login kopieren
<!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>
Nach dem Login kopieren

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage