网站统计 x23 IP,URI统计
This commit is contained in:
parent
e6a604741f
commit
7756a2edf3
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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){
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue