python写一个日志查询工具(登录ftp服务器得到日志并分析)

这两天比较闲,于是又捡起之前学了一点的python。也不知道用python做一个什么东西,但是如果不做个小工具,那python学了也是会很快就忘掉的。这时,突然想起来之前做的一个网站,里面有一些日志,拿python去处理这些日志岂不是很合适?

说动手就动手,下载了pycharm,开始干!新建一个工程,因为之前写java比较多,python的字典用着不是很顺手,那就先写一个map吧。

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
# coding:utf-8
__author__ = 'Gavin'
class HashMap(object):
def __init__(self):
self.dic = {}
def size(self):
return len(self.dic)
def put(self, key, value):
if self.dic.has_key(key):
oldValue = self.dic[key]
self.dic[key] = value
return oldValue
self.dic[key] = value
return None
def get(self, key):
if self.dic.has_key(key):
return self.dic[key]
return None
def containsKey(self, key):
if self.dic.has_key(key):
return True
return False
def containsValue(self, value):
for k, v in self.dic.items():
if v == value:
return True
return False
def keySets(self):
return self.dic.iterkeys()
def valueSets(self):
return self.dic.itervalues()

因为需要登录这个网站去down这些日志,那就需要写一个从ftp服务器dawn文件的工具。python自带了一个ftplib,其中就有FTP类,这个类用起来不太方便,于是乎再写一个包装类。

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
# coding:utf-8
__author__ = 'Gavin'
import os
from ftplib import FTP, error_perm
class FTPUtils(object):
def __init__(self, host):
self.ftp = FTP()
self.ftp.connect(host, 21)
print '***Connected to host "%s"' % host
#登录
def login(self, user, password):
try:
self.ftp.login(user, password)
except error_perm:
print 'ERROR: cannot login as %' % user
self.ftp.quit()
return
print '***Logged in as %s' % user
#移动到某个目录下
def cwd(self, where):
try:
self.ftp.cwd(where)
except error_perm:
print 'ERRORL cannot CD to "%s"' % where
self.ftp.quit()
return
print '*** Changed to "%s" folder' % where
#下载文件
def get(self, local):
try:
self.ftp.retrbinary('RETR %s' % local, open(local, 'wb').write)
print "start"
except error_perm:
print 'ERROR: cannot read file "%s"' % local
os.unlink(local)
else:
print '*** Downloaded "%s" to CWD' % local
self.ftp.quit()
print "end"
return
#列出当前目录
def dir(self):
self.ftp.dir()
#下载当前目录所有文件
def down_all(self, path):
list = self.ftp.nlst()
for l in list:
self.ftp.retrbinary('RETR %s' % l, open(path + "/" + l, 'wb').write)
return
#关闭ftp连接
def close(self):
self.ftp.close()
if __name__ == "__main__":
port = 22
host = "xxx.cn"
user = "xxx"
password = "xxx"
test = FTPUtils(host)
test.login(user, password)
test.cwd("application/logs")
os.mkdir("logs")
test.down_all("logs/")
test.close()

有了这两个顺手的工具,那接下来就简单了许多。我需要从ftp服务器的logs文件夹下down出这些文件,然后对这些文件的记录进行一个规整,看看都有哪些错误出现。

代码如下:

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
# coding:utf-8
__author__ = 'Gavin'
import os
from HashMap import HashMap
import shutil
from FTPUtils import FTPUtils
class ghc(object):
def __init__(self):
self.name = "ghc"
def look(self):
print self.name
def dispose(self, host, user, password):
#从ftp服务器下载文件
if host != None:
if os.path.exists("logs"):
shutil.rmtree("logs")
test = FTPUtils(host)
test.login(user, password)
test.cwd("application/logs")
os.mkdir("logs")
test.down_all("logs/")
host = None
#列出下载到的文件
lists = os.listdir("logs")
map = HashMap()
for l in lists:
#只需要以php结尾的log文件
if l.endswith("html"):
continue
file = open("logs/" + l)
line = file.readline()
line = file.readline()
while line != "":
#得到log文件中某一行的错误信息
if len(line.strip().split(" ")) != 1:
map.put(line.strip().split(" ", 5)[5], None)
line = file.readline()
file.close()
for k in map.keySets():
#打印错误信息
print k
shutil.rmtree("logs")
if __name__ == "__main__":
port = 22
host = "xxx.cn"
user = "xxx"
password = "xxx"
g = ghc()
g.dispose(host, user, password)

运行结果还算可以,但是如果想在别的机器上运行这个小工具,但是有没有python环境那可不太好。于是在网上搜到一个Pyinstaller的py2exe工具。下载过程还蛮艰辛,pywin32这个库好难下,一直卡着出不来。于是在网上搜到一个pywin32安装工具,顺手一安装,OK了。

upload successful

接下来就是打包了,命令是这样的

1
python {你的Pyinstaller文件夹位置}pyinstaller.py --console --onefile ghc.py

–console是指转化为命令行式的exe文件,–onefile是指转化为一个文件,把其他需要的文件都加到这个文件中。

这样就OK了,可执行文件也能运行了。注意要在程序最底下加一句os.system(“pause”)。要不然程序跑完就关闭了,啥也看不到。

upload successful

总结一下,写这个小工具大概用了不到两百行代码,结构也比较清晰。在一些领域python果真用起来爽一些。正如人称:人生苦短,我用python。