python運維管理系統「python運維開發實例」

在日常工作中,我們以往登錄到服務器部署安裝環境時,所操作的命令都是實時打印過程信息或者查看應用日誌實時輸出日誌的時候我們也可以用tailf命令實時顯示,

但是當我們把這些工作web平台化之後,怎麼使用實時查看日誌呢,我使用過以下兩種方法實現:

1. 前端網頁使用ajax定時向服務器請求獲取日誌信息返回。是不是有點low,但功能還是實現了。

2. 前端網頁使用websocket建立連接,實時從服務器接收日誌。

目前使用第二種方法通過使用flask來實現。

以下簡單演示實現過程,從服務器中實時顯示日誌,可根據實際情況進行修改。運維開發之利用python實現WEB實時查看服務器日誌

配圖,代碼參考往下內容

1.測試環境python3 使用pip安裝以下庫

Flask==1.1.2

gevent==20.9.0

gevent-websocket==0.10.1

2.服務端代碼

import os
import time
import logging
from gevent import monkey

monkey.patch_all()
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.exceptions import WebSocketError
from flask import Flask, request, render_template
from multiprocessing import cpu_count, Process

app = Flask(__name__)

def tailf(filename, websocket):
    """打開文件並把讀取內容發給websocket"""
    with open(filename) as f:
        # 輸出已經存在的文件內容
        websocket.send(''.join(f.readlines()))
        # 移動到了文件EOF處
        f.seek(0, 2)
        while True:
            line = f.readline()
            if line:
                websocket.send(line)
            else:
                time.sleep(1)


@app.route('/tailf/')
def tailf_log():
    websocket = request.environ['wsgi.websocket']
    # 演示功能這裡寫死,實際使用可自定義
    filename = '/data/ops/20201117/test.log'
    if os.path.exists(filename):
        try:
            tailf(filename, websocket)
        except WebSocketError as e:
            logging.info('error {} websocket Closed!'.format(e))
            websocket.close()
        return 'ok'
    else:
        websocket.send('<h3>查看的文件不存在!</h3>')


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


# 日誌配置
logging.basicConfig(
    filename='logs.log',
    format='%(asctime)s %(levelname)s: %(message)s',
    level='INFO')
# 實例化 這裡包括監聽端口
ws_server = WSGIServer(
    ('0.0.0.0', 5000),
    app,
    log=logging,
    handler_class=WebSocketHandler,
)
ws_server.start()


def serve_forever():
    try:
        ws_server.start_accepting()
        ws_server._stop_event.wait()
    except KeyboardInterrupt:
        ws_server.stop()


if __name__ == "__main__":
    # 用multiprocessing配合gevent來啟動多進程
    for i in range(cpu_count()):
        p = Process(target=serve_forever)
        p.start()

3.前端代碼(需要引入jquery.min.js

<!doctype html>
<html lang="en">
<head>
    <title>實時日誌查看</title>
    <!-- jQuery 3 -->
    <script src="{{ url_for('static', filename='jquery/dist/jquery.min.js') }}"></script>
</head>
<body>
<div class="container">
    <div id="log_id" style="height: 95vh; overflow-y: scroll;padding: 10px;">
        <pre></pre>
    </div>
</div>
<script>
    var ws_scheme = window.location.protocol === "https:" ? "wss" : "ws";
    var socket = new WebSocket(ws_scheme + '://' + "192.168.209.222:5000/tailf/");
    var log_id = $("#log_id");
    var log_pre_id = $("#log_id pre");

    socket.onopen = function () {
        socket.onmessage = function (msg) {
            log_pre_id.append(msg.data);
            // 滾動條滾動到最低部
            log_id.scrollTop(log_pre_id.height() - log_id.height());
        };
    };
    socket.onerror = function () {
        log_pre_id.innerHTML = '<h3>連接websocket失敗!</h3>';
    };

    window.onbeforeunload = function (event) {
        console.log("關閉WebSocket連接!");
        socket.close();
    }
</script>
</body>
</html>

4.運行代碼進行測試

在服務器上模擬定時輸出信息到日誌文件

for i in $(seq 1 1000);do echo -e “$i —————-” >> /data/ops/20201117/test.log;sleep 1;done

在瀏覽器打開網頁實時查看

運維開發之利用python實現WEB實時查看服務器日誌

PS: 我比較好奇在頭條發這一類文章有沒有流量的,畢竟在這裡的大部分以手機端娛樂為主

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/251164.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-13 17:22
下一篇 2024-12-13 17:22

相關推薦

發表回復

登錄後才能評論