使用python+Flask實(shí)現(xiàn)日志在web網(wǎng)頁實(shí)時(shí)更新顯示
一、日志輸出到文件
使用模塊:logging
可以生成自定義等級日志,可以輸出日志到指定路徑
日志等級:debug(調(diào)試日志) < info(重要信息日志) < warning(警告日志) < error(異常日志) < critical(嚴(yán)重錯誤)
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) #進(jìn)入文件目錄 if delete == True: open(f"{path}/{name}","w").close #為True時(shí)清空文本 # 創(chuàng)建一個(gè)日志處理器 self.logger = lg.getLogger('logger') # 設(shè)置日志等級,低于設(shè)置等級的日志被丟棄 self.logger.setLevel(lg.DEBUG) # 設(shè)置輸出日志格式 self.fmt = lg.Formatter("[%(asctime)s] - %(levelname)s: %(message)s","%Y-%m-%d %H:%M:%S") # 創(chuàng)建一個(gè)文件處理器 self.fh = lg.FileHandler(self.log_,encoding='utf-8') # 設(shè)置文件輸出格式 self.fh.setFormatter(self.fmt) # 將文件處理器添加到日志處理器中 self.logger.addHandler(self.fh) # 創(chuàng)建一個(gè)控制臺處理器 self.sh=lg.StreamHandler() # 設(shè)置控制臺輸出格式 self.sh.setFormatter(self.fmt) # 將控制臺處理器添加到日志處理器中 self.logger.addHandler(self.sh) # 關(guān)閉文件 self.fh.close() # 使用 if __name__ == '__main__': _path = os.paht.dirname(__file__) # 獲取當(dāng)前文件的路徑 lg = logging_(_path).logger # 實(shí)例化封裝類 lg.info('1111') lg.debug('2222') lg.error('33333') lg.warning('44444')
運(yùn)行后輸出內(nèi)容,當(dāng)前文件目錄下多了一個(gè)log.log文件:
日志內(nèi)容:
二、生成日志和讀取日志
1、新建一個(gè)py文件(generation_log),文件名自定,
2、直接上代碼
# 導(dǎo)入上面封裝好的日志輸出 from logging.demo_01 import logging_ import os,time _path = os.path.dirname(__file__) # 獲取當(dāng)前文件路徑 lg = logging_(_path) # 實(shí)例化類 # 創(chuàng)建方法生成日志 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時(shí)返回空 if log_size == 0: return '' while True: # 判斷offset是否大于文件字節(jié)數(shù),是則讀取所有行,并返回 if (abs(offset) >= log_size): f.seek(-log_size, 2) data = f.readlines() return data # 游標(biāo)移動倒數(shù)的字節(jié)數(shù)位置 data = f.readlines() # 判斷讀取到的行數(shù),如果大于1則返回最后一行,否則擴(kuò)大offset if (len(data) > 1): return data else: offset *= 2
三、Flask創(chuàng)建一個(gè)web服務(wù)
flask是干啥的當(dāng)下不做解釋,有興趣可以百度也可以等待我的更新嘎嘎,這里直接上步驟加代碼,快速實(shí)現(xiàn)一個(gè)簡單的web頁面
1、目錄下創(chuàng)建一個(gè)app.py文件輸入下面代碼
#導(dǎo)入flask模塊 from flask import Flask,request,render_template # 導(dǎo)入日志生成和日志返回方法 from study.logging.generation_log import generation_log,red_logs app = Flask(__name__) line_number = [0] #存放當(dāng)前日志行數(shù) # 定義接口把處理日志并返回到前端 @app.route('/get_log',methods=['GET','POST']) def get_log(): log_data = red_logs() # 獲取日志 # 判斷如果此次獲取日志行數(shù)減去上一次獲取日志行數(shù)大于0,代表獲取到新的日志 if len(log_data) - line_number[0] > 0: log_type = 2 # 當(dāng)前獲取到日志 log_difference = len(log_data) - line_number[0] # 計(jì)算獲取到少行新日志 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() # 刪除上一次獲取行數(shù) line_number.append(len(log_data)) # 添加此次獲取行數(shù) return _log # 通過前端請求執(zhí)行生成日志方法 @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服務(wù)
2、目錄下創(chuàng)建一個(gè)templates目錄
3、在templates目錄下新建一個(gè)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 // 創(chuàng)建一個(gè)元素節(jié)點(diǎn) function insertAfter( newElement, targetElement ){ // newElement是要追加的元素targetElement 是指定元素的位置 var parent = targetElement.parentNode; // 找到指定元素的父節(jié)點(diǎn) parent.appendChild( newElement, targetElement ); }; function log(){ clearTimeout(time) // 清空定時(shí)器 var log_null = 0 //存放空日志次數(shù) var div = document.getElementById('log_list') //找到存放日志的塊 div.innerHTML = "<div id='log_text'></div>" // 每次跑清空div內(nèi)內(nèi)容 $.post('/generation_log',{},function (){ }) //請求生成日志接口 // 生成定時(shí)器 time = setInterval(function (){ $.get('/get_log',{},function (data){ //請求獲取日志接口獲取日志 if (data.log_type == 3){ //如果獲取的是空日志log_null次數(shù)加1 log_null ++ if (log_null >= 5){ clearTimeout(time) //如果連續(xù)10次獲取的都是空日志清除定時(shí)任務(wù) } return } if (data.log_type == 2){ //如果獲取到新日志 for (i=0;i<data.log_list.length;i++){ //遍歷日志 var p = document.createElement("p") //生成一個(gè)p標(biāo)簽 p.innerHTML = data.log_list[i] //日志存放到P標(biāo)簽內(nèi) var header = document.getElementById('log_text') insertAfter(p,header) //將p標(biāo)簽添加到log_text div中 div.scrollTop = div.scrollHeight //滾動條實(shí)時(shí)顯示到底部 } log_null = 0 //日志為空次數(shù)清0 } }) },1000) //每1秒鐘執(zhí)行一次 } document.getElementById('button').addEventListener("click",log) //點(diǎn)擊開始按鈕開始執(zhí)行 </script> </html>
四、啟動服務(wù)
1、查看項(xiàng)目目錄,代碼是否編寫齊全
2、啟動app.py文件
3、訪問本地連接:http://127.0.0.1:5000/
4、點(diǎn)擊開始即可
總結(jié)
到此這篇關(guān)于使用python+Flask實(shí)現(xiàn)日志在web網(wǎng)頁實(shí)時(shí)更新顯示的文章就介紹到這了,更多相關(guān)python Flask實(shí)現(xiàn)日志實(shí)時(shí)顯示內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡單學(xué)習(xí)Python多進(jìn)程Multiprocessing
這篇文章主要和大家一起簡單的學(xué)習(xí)Python多進(jìn)程Multiprocessing ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Python學(xué)習(xí)之字典的常用方法總結(jié)
這篇文章主要為大家介紹了Python中字典的幾個(gè)常用方法總結(jié),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python字典有一定幫助,需要的可以參考一下2022-03-03Django通過dwebsocket實(shí)現(xiàn)websocket的例子
今天小編就為大家分享一篇Django通過dwebsocket實(shí)現(xiàn)websocket的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11python3 deque 雙向隊(duì)列創(chuàng)建與使用方法分析
這篇文章主要介紹了python3 deque 雙向隊(duì)列創(chuàng)建與使用方法,結(jié)合實(shí)例形式分析了python3 deque 雙向隊(duì)列創(chuàng)建、添加、清空、拷貝等相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-03-03Anaconda下Python中GDAL模塊的下載與安裝過程
這篇文章主要介紹了Anaconda下Python中GDAL模塊的下載與安裝方法,本文介紹在Anaconda環(huán)境下,安裝Python中柵格、矢量等地理數(shù)據(jù)處理庫GDAL的方法,需要的朋友可以參考下2023-04-04Python CategoricalDtype自定義排序?qū)崿F(xiàn)原理解析
這篇文章主要介紹了Python CategoricalDtype自定義排序?qū)崿F(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09使用NumPy讀取MNIST數(shù)據(jù)的實(shí)現(xiàn)代碼示例
這篇文章主要介紹了使用NumPy讀取MNIST數(shù)據(jù)的實(shí)現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11對matplotlib改變colorbar位置和方向的方法詳解
今天小編就為大家分享一篇對matplotlib改變colorbar位置和方向的方法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12