|
本帖最后由 winner 于 2012-11-9 21:09 编辑
1个小时写完,很简单就是分割字符串而已
可查看含有某些字符的项目,
例如 baidu.,
也可以用模式匹配语法 例如这样 404.*?baidu
PS:发现apache的日志也是可以用的
EXE文件:http://good.gd/2291915.htm
源码:
import win.ui;
/*DSG{{*/
mainForm = ..win.form( bottom=487;parent=...;right=891;text="Nginx日志分析工具 Power by aardio";maxmize=1 )
mainForm.add(
button2={ dl=1;bottom=37;text="筛选(包含指定词)";left=768;dt=1;top=13;z=4;right=881;cls="button" };
listview={ dr=1;dl=1;bgcolor=16777215;right=883;left=9;dt=1;db=1;cls="listview";bottom=478;top=60;z=1;gridLines=1;edge=1;fullRow=1 };
edit={ dl=1;bottom=35;right=510;left=12;dt=1;top=13;z=3;edge=1;cls="edit" };
button={ dl=1;bottom=36;text="选择日志文件";left=517;dt=1;top=12;z=2;right=608;cls="button" };
edit2={ dl=1;bottom=36;text="Baiduspider";left=630;dt=1;top=14;z=5;right=761;edge=1;cls="edit" }
)
/*}}*/
//插入列
var logList = mainForm.listview
logList.insertColumn("IP",150)
logList.insertColumn("Time",150)
logList.insertColumn("Method",100)
logList.insertColumn("Url",300)
logList.insertColumn("HTTP",50)
logList.insertColumn("Status",50)
logList.insertColumn("Length",50)
logList.insertColumn("User-Agent",600)
//线程方法, 参数[列表句柄,日志文件位置,包含词语]
function insertList(hwnd,logPath,keyword){
import win;
import win.ui.ctrl.listview;
var listview = win.ui.ctrl.listview()
listview.hwnd = hwnd;
listview.clear() //清除原来列表
thread.set("stop", false)
io.print(hwnd,logPath,keyword)
var lineNum = 0
//遍历日志文件
for line in io.lines(logPath) {
//中途重新查询的可能性,所以价格判断
var stop = thread.get("stop")
if(stop){
listview.clear() //清除原来列表
break;
}
//如果定义了包含词语,但是没有查找到这个词语,则跳过,不插入
if(keyword && !string.find(line,keyword)){
continue ;
}
var lineTxt = string.trim(line,'\n')
var logTab = string.split(lineTxt," ") //以空格,分割每行的字符串
//table.remove(logTab,1)
//移出无用元素
table.remove(logTab,2)
table.remove(logTab,2)
table.remove(logTab,3)
table.remove(logTab,8)
//去掉时间前面的符号 [
logTab[2] = string.trim(logTab[2],"'\[")
var user_agent = ""
//合并最后的user-agent
for(i=8;table.count(logTab);1){
user_agent += logTab[ i ]
}
logTab[8] = user_agent;
//插入到列表
listview.addItem(logTab)
lineNum++; //计算行数
if(lineNum%50 == 0){ //每50行,更新一下总数,翻一下页
listview.ensureVisible(lineNum) //反一下页,不然别人以为卡住了
listview.setColumnText(1,"IP("++listview.count++")") //设置总数
}
win.delay(1)
}
listview.setColumnText(1,"IP("++listview.count++")")
}
//选择日志文件
mainForm.button.oncommand = function(id,event){
//mainForm.msgbox( mainForm.button.text );
import fsys.dlg;
var path = fsys.dlg.open("*.*||","选择日志文件")
if(path){
//设置界面上的路径值
mainForm.edit.text = path;
thread.set("stop", true) //先停止以前的线程
//创建一个 insertList线程,用来遍历日志,插入到列表中
thread.create(
insertList,
mainForm.listview.hwnd,
path
)
}
}
//只显示包含词
mainForm.button2.oncommand = function(id,event){
if(mainForm.edit.text){
thread.set("stop", true) //先停止以前的线程
//创建一个 insertList线程,用来遍历日志,插入到列表中
thread.create(
insertList,
mainForm.listview.hwnd,
mainForm.edit.text, //传入日志文件路径
mainForm.edit2.text //传入包含词,上面那个没有参数
)
}else{
win.msgboxTest("必须先选择日志文件!","提示")
}
}
import config;
mainForm.bindConfig( config.mainForm,{
edit = "text"; //绑定edit控件的text属性值到配置文件
radiobutton = "checked";
checkbox = "checked";
combobox = "selIndex";
} );
mainForm.show()
win.loopMessage();
测试用的日志文件
test.zip
(372 Bytes, 下载次数: 923)
项目打包(带皮肤):
Nginx日志分析工具.zip
(23.29 KB, 下载次数: 102)
|
评分
-
查看全部评分
|