Rumah >pembangunan bahagian belakang >Tutorial Python >Membangunkan sistem yang memantau fail log yang terletak pada pelayan jauh, serupa dengan perintah Unix tail -f.

Membangunkan sistem yang memantau fail log yang terletak pada pelayan jauh, serupa dengan perintah Unix tail -f.

Barbara Streisand
Barbara Streisandasal
2024-09-28 22:11:02839semak imbas

Develop a system that monitors a log file located on a remote server, similar to the Unix command tail -f.

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:

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

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

  3. Pelayan mesti secara aktif menolak kemas kini kepada pelanggan untuk memastikan kelewatan yang minimum, mencapai kemas kini sedekat mungkin dengan masa nyata.

  4. Memandangkan fail log mungkin sangat besar (berkemungkinan beberapa gigabait), anda perlu membangunkan strategi untuk mengambil 10 baris terakhir dengan cekap tanpa memproses keseluruhan fail.

  5. Pelayan hendaklah menghantar hanya tambahan baharu pada fail kepada pelanggan, bukannya menghantar semula fail secara keseluruhannya.

  6. Adalah penting pelayan menyokong sambungan serentak daripada berbilang pelanggan tanpa penurunan prestasi.

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

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn