专注app软件定制开发python + Flask实现日志在web网页实时更新显示

一、专注app软件定制开发日志输出到文件

使用模块:logging

专注app软件定制开发可以生成自定义等级日志,专注app软件定制开发可以输出日志到指定路径
日志等级:debug(调试日志) < info(专注app软件定制开发重要信息日志) < warning(警告日志) < error(异常日志) < critical(严重错误)

1、专注app软件定制开发封装日志输出方法()

import logging as lgimport osclass logging_():    def __init__(path,delete=True)        self.path = path #日志文件存放位置        name = 'log.log' #日志文件名称        self.log_ = os.path.join(self.path,name) #进入文件目录        if delete == Trueopen(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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

运行后输出内容,当前文件目录下多了一个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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

三、创建一个web服务

flask是干啥的当下不做解释,有兴趣可以百度也可以等待我的更新嘎嘎,这里直接上步骤加代码,快速实现一个简单的web页面

1、目录下创建一个app.py文件输入下面代码

#导入flask模块from flask import Flask,request,render_template# 导入日志生成和日志返回方法from study.logging.generation_log import generation_log,red_logsapp = 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服务
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

四、启动服务

1、查看项目目录,代码是否编写齐全

2、启动app.py文件

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

4、点击开始即可

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发