网站统计 x23 IP,URI统计

This commit is contained in:
midoks 2022-07-26 22:27:26 +08:00
parent e6a604741f
commit 7756a2edf3
5 changed files with 465 additions and 4 deletions

View File

@ -32,6 +32,14 @@
overflow: auto;
}
.share_num {
background-color: #ff7e0e;
box-sizing: border-box;
height: 25px;
display: inline-block;
vertical-align: bottom;
}
.form-control{
border-radius: 0px;
}
@ -187,6 +195,8 @@
<p onclick="wsSitesList();">网站列表</p>
<p onclick="wsSpiderStat();">蜘蛛统计</p>
<p onclick="wsClientStat();">客服端统计</p>
<p onclick="wsIpStat();">IP统计</p>
<p onclick="wsUriStat();">URI统计</p>
<p onclick="wsSitesErrorLog();">错误日志</p>
<p onclick="wsSitesLog();">网站日志</p>
<p onclick="wsGlobalSetting();">全局设置</p>

View File

@ -862,6 +862,219 @@ def getClientStatList():
return mw.returnJson(True, 'ok', data)
def getDateRangeList(start, end):
dlist = []
if start > end:
for x in list(range(start, 32, 1)):
dlist.append(x)
for x in list(range(1, end, 1)):
dlist.append(x)
else:
for x in list(range(start, end, 1)):
dlist.append(x)
return dlist
def getIpStatList():
args = getArgs()
check = checkArgs(args, ['site', 'query_date'])
if not check[0]:
return check[1]
domain = args['site']
tojs = args['tojs']
query_date = args['query_date']
setDefaultSite(domain)
conn = pSqliteDb('ip_stat', domain)
origin_field = "ip,day,flow"
if query_date == "today":
ftime = time.localtime(time.time())
day = ftime.tm_mday
field_day = "day" + str(day)
field_flow = "flow" + str(day)
# print(field_day, field_flow)
field = "ip," + field_day + ' as day,' + field_flow + " as flow"
conn = conn.field(field)
conn = conn.where("day>? and flow>?", (0, 0,))
elif query_date == "yesterday":
ftime = time.localtime(time.time() - 86400)
day = ftime.tm_mday
field_day = "day" + str(day)
field_flow = "flow" + str(day)
field = "ip," + field_day + ' as day,' + field_flow + " as flow"
conn = conn.field(field)
conn = conn.where("day>? and flow>?", (0, 0,))
elif query_date == "l7":
field_day = ""
field_flow = ""
now_time = time.localtime(time.time())
end_day = now_time.tm_mday
start_time = time.localtime(time.time() - 7 * 86400)
start_day = start_time.tm_mday
rlist = getDateRangeList(start_day, end_day)
for x in rlist:
field_day += "+cast(day" + str(x) + " as TEXT)"
field_flow += "+cast(flow" + str(x) + " as TEXT)"
field_day = field_day.strip("+")
field_flow = field_flow.strip("+")
field = "ip,(" + field_day + ') as day,(' + field_flow + ") as flow"
conn = conn.field(field)
conn = conn.where("day>? and flow>?", (0, 0,))
elif query_date == "l30":
field_day = ""
field_flow = ""
for x in list(range(1, 32, 1)):
field_day += "+cast(day" + str(x) + " as TEXT)"
field_flow += "+cast(flow" + str(x) + " as TEXT)"
field_day = field_day.strip("+")
field_flow = field_flow.strip("+")
# print(field_day)
# print(field_flow)
field = "ip,(" + field_day + ') as day,(' + field_flow + ") as flow"
conn = conn.field(field)
conn = conn.where("day>? and flow>?", (0, 0,))
clist = conn.order("flow desc").limit("50").inquiry(origin_field)
# print(clist)
total_req = 0
total_flow = 0
for x in clist:
total_req += x['day']
total_flow += x['flow']
for i in range(len(clist)):
clist[i]['day_rate'] = round((clist[i]['day'] / total_req) * 100, 2)
clist[i]['flow_rate'] = round((clist[i]['flow'] / total_flow) * 100, 2)
return mw.returnJson(True, 'ok', clist)
def getUriStatList():
args = getArgs()
check = checkArgs(args, ['site', 'query_date'])
if not check[0]:
return check[1]
domain = args['site']
tojs = args['tojs']
query_date = args['query_date']
setDefaultSite(domain)
conn = pSqliteDb('uri_stat', domain)
origin_field = "uri,day,flow"
if query_date == "today":
ftime = time.localtime(time.time())
day = ftime.tm_mday
field_day = "day" + str(day)
field_flow = "flow" + str(day)
# print(field_day, field_flow)
field = "uri," + field_day + ' as day,' + field_flow + " as flow"
conn = conn.field(field)
conn = conn.where("day>? and flow>?", (0, 0,))
elif query_date == "yesterday":
ftime = time.localtime(time.time() - 86400)
day = ftime.tm_mday
field_day = "day" + str(day)
field_flow = "flow" + str(day)
field = "uri," + field_day + ' as day,' + field_flow + " as flow"
conn = conn.field(field)
conn = conn.where("day>? and flow>?", (0, 0,))
elif query_date == "l7":
field_day = ""
field_flow = ""
now_time = time.localtime(time.time())
end_day = now_time.tm_mday
start_time = time.localtime(time.time() - 7 * 86400)
start_day = start_time.tm_mday
rlist = getDateRangeList(start_day, end_day)
for x in rlist:
field_day += "+cast(day" + str(x) + " as TEXT)"
field_flow += "+cast(flow" + str(x) + " as TEXT)"
field_day = field_day.strip("+")
field_flow = field_flow.strip("+")
field = "uri,(" + field_day + ') as day,(' + field_flow + ") as flow"
conn = conn.field(field)
conn = conn.where("day>? and flow>?", (0, 0,))
elif query_date == "l30":
field_day = ""
field_flow = ""
for x in list(range(1, 32, 1)):
field_day += "+cast(day" + str(x) + " as TEXT)"
field_flow += "+cast(flow" + str(x) + " as TEXT)"
field_day = field_day.strip("+")
field_flow = field_flow.strip("+")
# print(field_day)
# print(field_flow)
field = "uri,(" + field_day + ') as day,(' + field_flow + ") as flow"
conn = conn.field(field)
conn = conn.where("day>? and flow>?", (0, 0,))
clist = conn.order("flow desc").limit("50").inquiry(origin_field)
# print(clist)
total_req = 0
total_flow = 0
for x in clist:
total_req += x['day']
total_flow += x['flow']
for i in range(len(clist)):
clist[i]['day_rate'] = round((clist[i]['day'] / total_req) * 100, 2)
clist[i]['flow_rate'] = round((clist[i]['flow'] / total_flow) * 100, 2)
return mw.returnJson(True, 'ok', clist)
def getWebLogCount(domain, query_date):
conn = pSqliteDb('web_logs', domain)
@ -1022,6 +1235,10 @@ if __name__ == "__main__":
print(getLogsRealtimeInfo())
elif func == 'get_client_stat_list':
print(getClientStatList())
elif func == 'get_ip_stat_list':
print(getIpStatList())
elif func == 'get_uri_stat_list':
print(getUriStatList())
elif func == 'get_spider_stat_list':
print(getSpiderStatList())
else:

View File

@ -4,7 +4,7 @@
"name": "webstats",
"title": "网站统计",
"shell": "install.sh",
"versions":["0.1.0"],
"versions":["0.2.0"],
"tip": "soft",
"checks": "server/webstats",
"path": "server/webstats",

View File

@ -1731,6 +1731,240 @@ wsPost('get_default_site','',{},function(rdata){
function wsIpStatLogRequest(page){
var args = {}
args['site'] = $('select[name="site"]').val();
var query_date = 'today';
query_date = $('#search_time button.cur').attr("data-name");
args['query_date'] = query_date;
args['tojs'] = 'wsIpStatLogRequest';
wsPost('get_ip_stat_list', '' ,args, function(rdata){
var rdata = $.parseJSON(rdata.data);
var list = '';
var data = rdata.data;
// console.log(rdata,data);
if (data.length > 0){
for(i in data){
list += '<tr>';
list += '<td>' + (parseInt(i)+1)+'</td>';
list += '<td><span style="width:100px;">' + data[i]['ip']+'</span></td>';
list += '<td>' + "0" +'</td>';
list += '<td>' + data[i]['day'] +'('+data[i]['day_rate']+'%)</td>';
list += '<td>' + toSize(data[i]['flow']) +'('+data[i]['flow_rate']+'%)</td>';
list += '<td><span><div class="share_num" style="width:'+data[i]['flow_rate']+'%"></div></span>' +'</td>';
list += '</tr>';
}
} else{
list += '<tr><td colspan="6" style="text-align:center;">IP列表为空</td></tr>';
}
var table = '<div class="tablescroll">\
<table id="DataBody" class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
<thead><tr>\
<th>序号</th>\
<th>IP</th>\
<th>归属地(仅供参考)</th>\
<th>请求数</th>\
<th>流量</th>\
<th>流量占比图</th>\
</tr></thead>\
<tbody>\
'+ list +'\
</tbody></table>\
</div>\
<div id="wsPage" class="dataTables_paginate paging_bootstrap page"></div>';
$('#ws_table').html(table);
});
}
function wsIpStat(){
////////////////////////////////////////////////////////////////////////////////////////////////////////
var randstr = getRandomString(10);
var html = '<div>\
<div style="padding-bottom:10px;">\
<span>网站: </span>\
<select class="bt-input-text" name="site" style="margin-left:4px;width:100px;">\
<option value="unset">未设置</option>\
</select>\
<span style="margin-left:10px">时间: </span>\
<div class="input-group" style="margin-left:10px;width:350px;display: inline-table;vertical-align: top;">\
<div id="search_time" class="input-group-btn btn-group-sm">\
<button data-name="today" type="button" class="btn btn-default">今日</button>\
<button data-name="yesterday" type="button" class="btn btn-default">昨日</button>\
<button data-name="l7" type="button" class="btn btn-default">近7天</button>\
<button data-name="l30" type="button" class="btn btn-default">近30天</button>\
</div>\
</div>\
</div>\
<div class="divtable mtb10" id="ws_table"></div>\
</div>';
$(".soft-man-con").html(html);
$('#search_time button:eq(0)').addClass('cur');
$('#search_time button').click(function(){
$('#search_time button').each(function(){
if ($(this).hasClass('cur')){
$(this).removeClass('cur');
}
});
$('#time_choose').attr("data-name",'');
$('#time_choose').removeClass("cur");
$(this).addClass('cur');
wsIpStatLogRequest(1);
});
wsPost('get_default_site','',{},function(rdata){
$('select[name="site"]').html('');
var rdata = $.parseJSON(rdata.data);
var rdata = rdata.data;
var default_site = rdata["default"];
var select = '';
for (var i = 0; i < rdata["list"].length; i++) {
if (default_site == rdata["list"][i]){
select += '<option value="'+rdata["list"][i]+'" selected>'+rdata["list"][i]+'</option>';
} else{
select += '<option value="'+rdata["list"][i]+'">'+rdata["list"][i]+'</option>';
}
}
$('select[name="site"]').html(select);
wsIpStatLogRequest(1);
$('select[name="site"]').change(function(){
wsIpStatLogRequest(1);
});
});
////////////////////////////////////////////////////////////////////////////////////////////////////////
}
function wsUriStatLogRequest(page){
var args = {}
args['site'] = $('select[name="site"]').val();
var query_date = 'today';
query_date = $('#search_time button.cur').attr("data-name");
args['query_date'] = query_date;
args['tojs'] = 'wsUriStatLogRequest';
wsPost('get_uri_stat_list', '' ,args, function(rdata){
var rdata = $.parseJSON(rdata.data);
var list = '';
var data = rdata.data;
// console.log(rdata,data);
if (data.length > 0){
for(i in data){
list += '<tr>';
list += '<td>' + (parseInt(i)+1)+'</td>';
list += '<td><span style="width:100px;">' + data[i]['uri']+'</span></td>';
list += '<td>' + data[i]['day'] +'('+data[i]['day_rate']+'%)</td>';
list += '<td>' + toSize(data[i]['flow']) +'('+data[i]['flow_rate']+'%)</td>';
list += '<td><span><div class="share_num" style="width:'+data[i]['flow_rate']+'%"></div></span>' +'</td>';
list += '</tr>';
}
} else{
list += '<tr><td colspan="6" style="text-align:center;">URI列表为空</td></tr>';
}
var table = '<div class="tablescroll">\
<table id="DataBody" class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0" style="border: 0 none;">\
<thead><tr>\
<th>序号</th>\
<th>URI</th>\
<th>请求数</th>\
<th>流量</th>\
<th>流量占比图</th>\
</tr></thead>\
<tbody>\
'+ list +'\
</tbody></table>\
</div>\
<div id="wsPage" class="dataTables_paginate paging_bootstrap page"></div>';
$('#ws_table').html(table);
});
}
function wsUriStat(){
////////////////////////////////////////////////////////////////////////////////////////////////////////
var randstr = getRandomString(10);
var html = '<div>\
<div style="padding-bottom:10px;">\
<span>网站: </span>\
<select class="bt-input-text" name="site" style="margin-left:4px;width:100px;">\
<option value="unset">未设置</option>\
</select>\
<span style="margin-left:10px">时间: </span>\
<div class="input-group" style="margin-left:10px;width:350px;display: inline-table;vertical-align: top;">\
<div id="search_time" class="input-group-btn btn-group-sm">\
<button data-name="today" type="button" class="btn btn-default">今日</button>\
<button data-name="yesterday" type="button" class="btn btn-default">昨日</button>\
<button data-name="l7" type="button" class="btn btn-default">近7天</button>\
<button data-name="l30" type="button" class="btn btn-default">近30天</button>\
</div>\
</div>\
</div>\
<div class="divtable mtb10" id="ws_table"></div>\
</div>';
$(".soft-man-con").html(html);
$('#search_time button:eq(0)').addClass('cur');
$('#search_time button').click(function(){
$('#search_time button').each(function(){
if ($(this).hasClass('cur')){
$(this).removeClass('cur');
}
});
$('#time_choose').attr("data-name",'');
$('#time_choose').removeClass("cur");
$(this).addClass('cur');
wsUriStatLogRequest(1);
});
wsPost('get_default_site','',{},function(rdata){
$('select[name="site"]').html('');
var rdata = $.parseJSON(rdata.data);
var rdata = rdata.data;
var default_site = rdata["default"];
var select = '';
for (var i = 0; i < rdata["list"].length; i++) {
if (default_site == rdata["list"][i]){
select += '<option value="'+rdata["list"][i]+'" selected>'+rdata["list"][i]+'</option>';
} else{
select += '<option value="'+rdata["list"][i]+'">'+rdata["list"][i]+'</option>';
}
}
$('select[name="site"]').html(select);
wsUriStatLogRequest(1);
$('select[name="site"]').change(function(){
wsUriStatLogRequest(1);
});
});
////////////////////////////////////////////////////////////////////////////////////////////////////////
}
function wsTableErrorLogRequest(page){

View File

@ -4,7 +4,7 @@ log_by_lua_block {
--
--
local ver = '0.0.1'
local ver = '0.2.0'
local max_log_id = 99999999999999
local debug_mode = true
@ -560,7 +560,7 @@ log_by_lua_block {
if site_exclude_ip then
for i, _ip in pairs(site_exclude_ip)
do
D("set exclude ip: ".._ip)
-- D("set exclude ip: ".._ip)
cache:set(input_server_name .. "_exclude_ip_".._ip, true)
end
end
@ -903,7 +903,7 @@ log_by_lua_block {
local worker_id = ngx.worker.id()
if is_working(input_server_name) then
-- D("其他worker正在存储中稍候存储。")
-- D("other workers are being stored, please store later.")
-- cache:delete(flush_data_key)
return true
end