[py]access日志入mysql-通过flask前端展示
目錄
- pymysql組裝sql入庫日志
- 代碼組織
- 將入庫的日志通過flask前端展示
pymysql組裝sql入庫日志
pymysql模塊的用法
采集這些指標(metirc)都是linux環境,會用到mysql,做為數據的存儲,我用docker來啟動
docker run \ -p 3306:3306 \ -v /data/mysql:/var/lib/mysql \ -v /etc/localtime:/etc/localtime \ --name mysql5 \ --restart=always \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.6.23 \ --character-set-server=utf8 \ --collation-server=utf8_general_ci create database mem; create table mem_used(used int, time int)- 時間格式 >>> import time >>> time.time() 1516860432.386474- 入庫后是整形,db自動處理, 也可以入庫前int(time). MySQL [mem]> select * from mem_used; +-----------+------------+ | used | time | +-----------+------------+ | 628658176 | 1516842082 | | 628813824 | 1516842083 | | 628936704 | 1516842084 | | 628936704 | 1516842085 | ...一個用法實例, 獲取指標(通過psutil模塊直接獲取到已使用的內存) 也可以自己算出.
import psutil import time import pymysql as mscon = ms.connect(host='127.0.0.1', user='root', passwd='123456', db='mem') con.autocommit(True) cur = con.cursor()while True:used = psutil.virtual_memory().usedsql = 'insert into mem_used values(%s,%s)' % (used / 1024 / 1024, int(time.time())) ## Mbcur.execute(sql)time.sleep(1)- %s可以接受任意類型的值后面會將db操作封裝成模塊.
說下本次的任務
- 本次的任務是將apache的access.log的(ip+狀態)+出現次數, 入庫到mysql里做分析. 分析網站訪問的top10
- 日志樣式如下, 以空格分隔 arr[0] arr[8] 分別是ip和狀態碼
通過pymysql模塊操作mysql數據庫
將結果放在res={}一個大的字典里. 核心統計思路如下. 如果字典無key,則value初始化為1; 如果字典有key,則 以key對應的value +1
- 對字典的值排序
代碼組織
入庫代碼
log2db.py
#!/usr/bin/env python # coding=utf-8from dbutils import DB# 連接mysql db = DB(host="127.0.0.1",user="root",passwd="",db="logtest" )# 日志處理成一個大的指定格式的字典(已統計好出現的次數) ((ip, status), count) res = {} with open('log.txt') as f:for line in f:if line == "\n":continuearr = line.split(" ")ip = arr[0]status = arr[8]res[(ip, status)] = res.get((ip, status), 0) + 1# 組合sql,執行sql入庫日志 for l in sorted(res.items(), key=lambda x: x[1], reverse=True):# {('192.168.1.1',404): 1000,('192.168.1.1',403): 3000,('192.168.1.1',200): 2000,}sql = "insert into log values ('%s','%s','%s')" % (l[0][0], l[0][1], l[1])db.execute(sql)dbutils.py
#!/usr/bin/env python # coding=utf-8import pymysql as msclass DB:def __init__(self, host, user, passwd, db):self.host = hostself.user = userself.passwd = passwdself.db = dbself.connect()def connect(self):self.conn = ms.connect(host=self.host,user=self.user,passwd=self.passwd,db=self.db)self.conn.autocommit(True)self.cursor = self.conn.cursor()def execute(self, sql):try:self.cursor.execute(sql)except Exception as e:self.cursor.close()self.conn.close()self.connect()return self.execute(sql)else:return self.cursor# def query(self,tables):# sql = 'select * from users'# self.cursor.execute(sql)# return self.cursor.fetchall()下載實例日志: https://github.com/lannyMa/flask_info/blob/master/demo5/log.txt
執行腳本入庫
python log2db.py結果查看
入庫完成后, flask前端展示+echarts
將入庫的日志通過flask前端展示
難點是找圖形的數據模型,即json數據格式. 后端返回. 所以當一幅圖出來后,要對其上面有啥數據,啥數據是后端返回的,要胸有成竹, 通過代碼+瀏覽器f12conson.log打印出來.
echarts官網上去看最簡單實例的教程,用flask展示出來
<!DOCTYPE html> <html> <head><meta charset="utf-8"><title>ECharts</title><!-- 引入 echarts.js --><script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/4.0.2/echarts.min.js"></script> </head> <body> <!-- 為ECharts準備一個具備大小(寬高)的Dom --> <div id="main" style="width: 600px;height:400px;"></div> <script type="text/javascript">// 基于準備好的dom,初始化echarts實例var myChart = echarts.init(document.getElementById('main'));// 指定圖表的配置項和數據var option = {title: {text: 'ECharts 入門示例'},tooltip: {},legend: {data: ['銷量']},xAxis: {data: ["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"]},yAxis: {},series: [{name: '銷量',type: 'bar',data: [5, 20, 36, 10, 10, 20]}]};// 使用剛指定的配置項和數據顯示圖表。myChart.setOption(option); </script> </body> </html>echarts.min.js路徑替換下
flask啟動展示
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/') def index():return render_template('demo.html')if __name__ == '__main__':app.run(debug=True)先找一個合適的echarts圖,觀察它所需的接口數據格式,后設計接口
計劃使用echarts這個餅圖展示
它的源碼如下
option = {title : {text: '某站點用戶訪問來源',subtext: '純屬虛構',x:'center'},tooltip : {trigger: 'item',formatter: "{a} <br/>{b} : {c} (ze8trgl8bvbq%)"},legend: {orient: 'vertical',left: 'left',data: ['直接訪問','郵件營銷','聯盟廣告','視頻廣告','搜索引擎']},series : [{name: '訪問來源',type: 'pie',radius : '55%',center: ['50%', '60%'],data:[{value:335, name:'直接訪問'},{value:310, name:'郵件營銷'},{value:234, name:'聯盟廣告'},{value:135, name:'視頻廣告'},{value:1548, name:'搜索引擎'}],itemStyle: {emphasis: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}] };下載后,修改echarts-pie.html源碼
<!DOCTYPE html> <html> <head><meta charset="utf-8"><title>ECharts</title><!-- 引入 echarts.js --><script src="/static/jquery.min.js"></script><script src="/static/echarts.min.js"></script> </head> <body><!-- 為ECharts準備一個具備大小(寬高)的Dom畫布 --> <div id="main" style="width: 600px;height:400px;"></div><script type="text/javascript">// 基于準備好的dom,初始化echarts實例var myChart = echarts.init(document.getElementById('main'));// 指定圖表的配置項和數據var option = {title: {text: '某站點用戶訪問來源',{# subtext: '純屬虛構',#}x: 'center'},tooltip: {trigger: 'item',formatter: "{a} <br/>{b} : {c} (ze8trgl8bvbq%)"},toolbox: {feature: {saveAsImage: {show: true}}},legend: {orient: 'vertical',left: 'left',{# data: ['直接訪問', '郵件營銷', '聯盟廣告', '視頻廣告', '搜索引擎']#}},series: [{name: '訪問來源',type: 'pie',radius: '55%',center: ['50%', '60%'],{# data: [#}{# {value: 335, name: '直接訪問'},#}{# {value: 310, name: '郵件營銷'},#}{# {value: 234, name: '聯盟廣告'},#}{# {value: 135, name: '視頻廣告'},#}{# {value: 1548, name: '搜索引擎'}#}{# ],#}itemStyle: {emphasis: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}]};//使用jq去訪問api獲取得到數據.$.getJSON('/piedata', function (res) {option.legend.data = res.legendoption.series[0].data = res.data// 使用剛指定的配置項和數據顯示圖表-綁定數據myChart.setOption(option);}) </script> </body> </html>我們知道了前端js需要的數據所需要的數據格式后,就從后端構造這樣的api,供前端調用
- api需返回數據的格式 {"data": [{"name": 200, "value": 49691}, {"name": 206, "value": 32}, {"name": 301, "value": 2}, {"name": 304, "value": 7584}, {"name": 403, "value": 1}, {"name": 404, "value": 3858}], "legend": [200, 206, 301, 304, 403, 404]}- js訪問接口方法 $.getJSON('/piedata', function (res) {option.legend.data = res.legendoption.series[0].data = res.datamyChart.setOption(option); //獲取后直接綁定 })設計top10狀態碼的api
- 目標是
- 查庫后得到的結果
查詢結果如下
- flask寫api
最終訪問
實現前端html展示
@app.route("/") def index():return render_template("echarts-pie.html")最終效果:
小結
轉載于:https://www.cnblogs.com/iiiiiher/p/8244145.html
總結
以上是生活随笔為你收集整理的[py]access日志入mysql-通过flask前端展示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: laravel数据迁移的时候遇到的字符串
- 下一篇: zabbix items 配置