Objektif masalah ini ialah:
Objektifnya adalah untuk membangunkan sistem yang memantau fail log yang terletak pada pelayan jauh, serupa dengan perintah Unix tail -f. Fail log sedang ditambah secara berterusan dengan data baharu. Sistem ini hendaklah terdiri daripada:
Aplikasi pelayan yang menjejaki perubahan berterusan pada fail log tertentu yang terletak pada pelayan yang sama. Aplikasi ini seharusnya mampu menghantar data yang baru ditambah dalam masa nyata kepada pelanggan.
Antara muka pelanggan berasaskan web, boleh dicapai melalui URL (cth., http://localhost/log), direka bentuk untuk memaparkan kemas kini fail log secara dinamik semasa ia berlaku, tanpa memerlukan pengguna memuat semula halaman. Pada mulanya, apabila melawat halaman tersebut, pengguna harus melihat 10 baris terbaharu daripada fail log.
Juga Mengendalikan senario berikut:
Pelayan mesti secara aktif menolak kemas kini kepada pelanggan untuk memastikan kelewatan yang minimum, mencapai kemas kini sedekat mungkin dengan masa nyata.
Memandangkan fail log mungkin sangat besar (berkemungkinan beberapa gigabait), anda perlu membangunkan strategi untuk mengambil 10 baris terakhir dengan cekap tanpa memproses keseluruhan fail.
Pelayan hendaklah menghantar hanya tambahan baharu pada fail kepada pelanggan, bukannya menghantar semula fail secara keseluruhannya.
Adalah penting pelayan menyokong sambungan serentak daripada berbilang pelanggan tanpa penurunan prestasi.
Halaman web pelanggan harus dimuatkan dengan segera tanpa kekal dalam keadaan pemuatan selepas permintaan awal dan ia tidak sepatutnya memerlukan muat semula untuk memaparkan kemas kini baharu.
Saya telah mencipta aplikasi Flask dengan UI ringkas yang memaparkan 10 mesej terakhir.
saya telah menggunakan flask-socketio untuk membentuk sambungan juga menggunakan beberapa konsep asas pengendalian fail seperti fileObj.seek(), fileObj.tell() dll.
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>
Juga buat fail client.log di bawah folder statik dalam aplikasi kelalang.
Sila berasa bebas untuk membetulkan saya jika saya melakukan sesuatu yang salah. Komen di bawah dengan sebarang pembetulan!
Atas ialah kandungan terperinci Membangunkan sistem yang memantau fail log yang terletak pada pelayan jauh, serupa dengan perintah Unix tail -f.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!