首頁 > 軟體

使用python+Flask實現紀錄檔在web網頁實時更新顯示

2022-08-06 14:00:24

一、紀錄檔輸出到檔案

使用模組:logging

可以生成自定義等級紀錄檔,可以輸出紀錄檔到指定路徑
紀錄檔等級:debug(偵錯紀錄檔) < info(重要資訊紀錄檔) < warning(警告紀錄檔) < error(異常紀錄檔) < critical(嚴重錯誤)

1、封裝紀錄檔輸出方法()

import logging as lg
import os

class logging_():
    def __init__(path,delete=True)
        self.path = path #紀錄檔檔案存放位置
        name = 'log.log' #紀錄檔檔名稱
        self.log_ = os.path.join(self.path,name) #進入檔案目錄
        if delete == True:
            open(f"{path}/{name}","w").close #為True時清空文字
        # 建立一個紀錄檔處理器
        self.logger = lg.getLogger('logger')
        # 設定紀錄檔等級,低於設定等級的紀錄檔被丟棄
        self.logger.setLevel(lg.DEBUG)
        # 設定輸出紀錄檔格式
        self.fmt = lg.Formatter("[%(asctime)s] - %(levelname)s: %(message)s","%Y-%m-%d %H:%M:%S")  
        # 建立一個檔案處理器
        self.fh = lg.FileHandler(self.log_,encoding='utf-8')
        # 設定檔案輸出格式
        self.fh.setFormatter(self.fmt)
        # 將檔案處理器新增到紀錄檔處理器中
        self.logger.addHandler(self.fh)
        # 建立一個控制檯處理器
        self.sh=lg.StreamHandler()
        # 設定控制檯輸出格式
        self.sh.setFormatter(self.fmt)
        # 將控制檯處理器新增到紀錄檔處理器中
        self.logger.addHandler(self.sh)
        
        # 關閉檔案
        self.fh.close()
        
# 使用
if __name__ == '__main__':
    _path = os.paht.dirname(__file__) # 獲取當前檔案的路徑
    lg = logging_(_path).logger # 範例化封裝類
    lg.info('1111')
    lg.debug('2222')
    lg.error('33333')
    lg.warning('44444')

執行後輸出內容,當前檔案目錄下多了一個log.log檔案:

紀錄檔內容:

二、生成紀錄檔和讀取紀錄檔

1、新建一個py檔案(generation_log),檔名自定,

2、直接上程式碼

# 匯入上面封裝好的紀錄檔輸出
from logging.demo_01 import logging_
import os,time
_path = os.path.dirname(__file__) # 獲取當前檔案路徑
lg = logging_(_path) # 範例化類

# 建立方法生成紀錄檔
def generation_log():    
    for i in range(20):
        lg.info(i)
        time.sleep(1)
        
# 讀取紀錄檔並返回
def red_logs():
    log_path = f'{_path}/log.log' # 獲取紀錄檔檔案路徑
    with open(log_path,'rb') as f:
        log_size = path.getsize(log_path) # 獲取紀錄檔大小
        offset = -100
        # 如果檔案大小為0時返回空
        if log_size == 0:
            return ''
        while True:
            # 判斷offset是否大於檔案位元組數,是則讀取所有行,並返回
            if (abs(offset) >= log_size):
                f.seek(-log_size, 2)
                data = f.readlines()
                return data
            # 遊標移動倒數的位元組數位置
            data = f.readlines()
            # 判斷讀取到的行數,如果大於1則返回最後一行,否則擴大offset
            if (len(data) > 1):
                return data
            else:
                offset *= 2

三、Flask建立一個web服務

flask是幹啥的當下不做解釋,有興趣可以百度也可以等待我的更新嘎嘎,這裡直接上步驟加程式碼,快速實現一個簡單的web頁面

1、目錄下建立一個app.py檔案輸入下面程式碼

#匯入flask模組
from flask import Flask,request,render_template
# 匯入紀錄檔生成和紀錄檔返回方法
from study.logging.generation_log import generation_log,red_logs

app = Flask(__name__)

line_number = [0] #存放當前紀錄檔行數
# 定義介面把處理紀錄檔並返回到前端
@app.route('/get_log',methods=['GET','POST'])
def get_log():
    log_data = red_logs() # 獲取紀錄檔
    # 判斷如果此次獲取紀錄檔行數減去上一次獲取紀錄檔行數大於0,代表獲取到新的紀錄檔
    if len(log_data) - line_number[0] > 0:
        log_type = 2 # 當前獲取到紀錄檔
        log_difference = len(log_data) - line_number[0] # 計算獲取到少行新紀錄檔
        log_list = [] # 存放獲取到的新紀錄檔
        # 遍歷獲取到的新紀錄檔存放到log_list中
        for i in range(log_difference):
            log_i = log_data[-(i+1)].decode('utf-8') # 遍歷每一條紀錄檔並解碼
            log_list.insert(0,log_i) # 將獲取的紀錄檔存放log_list中
    else:
        log_type = 3
        log_list = ''
    # 已字典形式返回前端
    _log = {
        'log_type' : log_type,
        'log_list' : log_list
    }
    line_number.pop() # 刪除上一次獲取行數
    line_number.append(len(log_data)) # 新增此次獲取行數
    return _log

# 通過前端請求執行生成紀錄檔方法
@app.route('/generation_log',methods=['GET','POST'])
def generation_log_():
    if request.method == 'POST':
        generation_log()
    return ''

@app.route('/',methods=['GET','POST'])
def index():
    if request.method == 'GET':
        return render_template('index.html')
    if request.method == 'POST':
        return render_template('index.html')

if __name__ == "__main__":
    app.run(debug=True) #啟動web服務

2、目錄下建立一個templates目錄

3、在templates目錄下新建一個index.html檔案,並輸入下面前端程式碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body{
            margin: auto;
            background-color: #f5f5f5;
        }
        .button{width: 200px;height: 50px;color:#FFFFFF;background-color: #1da1f2}
        .log{
            width: 98%;
            height: 500px;
            background-color: #FFFFFF;
            margin: 0 auto;
            margin-top: 10px;
            padding-top: 30px;
            padding-bottom: 40px;
        }
        .log_text{
            height: 500px;
            margin-left: 80px;
            font-size: 18px;
            color: #111111;
            overflow-x: hidden;
            overflow-y: auto;
        }
    </style>
</head>
<body>
<button id="button" class="button">開始</button>
<div class="log">
    <div class="log_text" id='log_list'>
        <div id="log_text"></div>
    </div>
</div>
</body>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
    var time
      // 建立一個元素節點
    function insertAfter( newElement, targetElement ){ // newElement是要追加的元素targetElement 是指定元素的位置
        var parent = targetElement.parentNode; // 找到指定元素的父節點
        parent.appendChild( newElement, targetElement );
    };
    function log(){
        clearTimeout(time) // 清空定時器
        var log_null = 0 //存放空紀錄檔次數
        var div = document.getElementById('log_list') //找到存放紀錄檔的塊
        div.innerHTML = "<div id='log_text'></div>" // 每次跑清空div內內容

        $.post('/generation_log',{},function (){
        }) //請求生成紀錄檔介面
        // 生成定時器
        time = setInterval(function (){
            $.get('/get_log',{},function (data){ //請求獲取紀錄檔介面獲取紀錄檔
                if (data.log_type == 3){ //如果獲取的是空紀錄檔log_null次數加1
                    log_null ++
                    if (log_null >= 5){
                        clearTimeout(time) //如果連續10次獲取的都是空紀錄檔清除定時任務
                    }
                    return
                }
                if (data.log_type == 2){ //如果獲取到新紀錄檔
                    for (i=0;i<data.log_list.length;i++){ //遍歷紀錄檔
                        var p = document.createElement("p") //生成一個p標籤
                        p.innerHTML = data.log_list[i] //紀錄檔存放到P標籤內
                        var header = document.getElementById('log_text')
                        insertAfter(p,header) //將p標籤新增到log_text div中
                        div.scrollTop = div.scrollHeight //卷軸實時顯示到底部
                    }
                    log_null = 0 //紀錄檔為空次數清0
                }

            })
        },1000) //每1秒鐘執行一次
    }
    document.getElementById('button').addEventListener("click",log) //點選開始按鈕開始執行
</script>
</html>

四、啟動服務

1、檢視專案目錄,程式碼是否編寫齊全

2、啟動app.py檔案

3、存取本地連線:http://127.0.0.1:5000/

4、點選開始即可

總結 

到此這篇關於使用python+Flask實現紀錄檔在web網頁實時更新顯示的文章就介紹到這了,更多相關python Flask實現紀錄檔實時顯示內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com