首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python写一个日志查询工具(登录ftp服务器得到日志并分析)

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

作者头像
zhangheng
发布2020-04-28 17:54:37
7720
发布2020-04-28 17:54:37
举报

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

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

# 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类,这个类用起来不太方便,于是乎再写一个包装类。

# 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出这些文件,然后对这些文件的记录进行一个规整,看看都有哪些错误出现。

代码如下:

# 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
upload successful

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

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

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

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

upload successful
upload successful

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档