使用python+Flask实现日志在web网页实时更新显示

作者:liuage_ 时间:2021-03-15 10:16:30 

一、日志输出到文件

使用模块: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文件:

使用python+Flask实现日志在web网页实时更新显示

日志内容:

使用python+Flask实现日志在web网页实时更新显示

二、生成日志和读取日志

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、查看项目目录,代码是否编写齐全

使用python+Flask实现日志在web网页实时更新显示

2、启动app.py文件

使用python+Flask实现日志在web网页实时更新显示

3、访问本地连接:http://127.0.0.1:5000/

使用python+Flask实现日志在web网页实时更新显示

4、点击开始即可

使用python+Flask实现日志在web网页实时更新显示

总结 

来源:https://blog.csdn.net/liuage_/article/details/124062985

标签:python,flask,日志
0
投稿

猜你喜欢

  • FCKeditor编辑器实战技巧

    2007-10-08 21:13:00
  • windows下python安装pip图文教程

    2023-11-18 19:27:20
  • 2008年情人节各网站节日Logo欣赏

    2008-02-17 14:12:00
  • Python内置函数——__import__ 的使用方法

    2022-07-18 21:02:18
  • asp中限制重复提交表单的方法

    2007-09-20 13:28:00
  • Python statistics模块示例详解

    2023-01-27 11:49:47
  • Python基于Socket实现简易多人聊天室的示例代码

    2021-08-04 14:50:21
  • python 遍历pd.Series的index和value

    2021-12-27 15:50:42
  • 细化解析:转换 SQL数据库时的疑难问题

    2009-02-05 15:38:00
  • 零基础学python应该从哪里入手

    2023-04-27 20:44:56
  • python 寻找优化使成本函数最小的最优解的方法

    2023-03-02 16:42:39
  • 三分钟学会Sql Server的复制功能[图]

    2008-07-18 12:18:00
  • Python程序打包工具py2exe和PyInstaller详解

    2021-04-17 05:04:12
  • Python Excel数据处理之xlrd/xlwt/xlutils模块详解

    2022-03-28 16:45:53
  • 5款Python程序员高频使用开发工具推荐

    2022-01-25 14:09:16
  • plt.title()中文无法显示的问题解决

    2023-07-24 06:05:33
  • python IP地址转整数

    2023-06-08 22:38:25
  • 详解Pytorch如何利用yaml定义卷积网络

    2023-02-16 10:46:01
  • 用asp编写文档搜索页面

    2008-01-13 07:04:00
  • 实现php删除链表中重复的结点

    2023-09-05 09:36:15
  • asp之家 网络编程 m.aspxhome.com