美文网首页技术杂谈程序员
基于python3下载生产日志

基于python3下载生产日志

作者: 数齐 | 来源:发表于2018-04-01 11:42 被阅读65次

生产环境可能会遇到各种问题,最常用也是最有效的排查方式就是查看生产日志。但是有的生产日志是放到归档的日志服务器上,这就需要我们去下载。操作很繁琐,无非就是登陆日志服务器,找到日志文件,下载。只要是繁琐的重复性的内容都可以通过程序来解决(至少我是这么认为的),今天我们就利用python3来实现一下这个功能。

观察文件路径

一般来说,针对日志服务器存放的文件都会有一定的规律,比如说常见的就是项目名作为文件路径的元素。例如:/admin/2018/ttt/03/192.168.100.04-20180324.log,其中ttt代表了项目名称。

分析文件路径

得到了这个路径后,我们就得知道该怎么拼接得到这个路径。首先/admin/这个路径是固定的,所以我们不需要特别处理。20180320180324这些数据,我们可以通过方法的入参传递过来,我们需要的仅仅就是一个日志的时间即可。我们的日志时间入参为2018-03-24
# 将2018-03-24格式的字符串变成python3的日期对象
trans_time = time.strptime(log_time, '%Y-%m-%d')
# 通过日期对象获得年:2018
year = time.strftime('%Y', trans_time)
# 通过日期对象获得月:03
month = time.strftime('%m', trans_time)
# 通过日期对象获得转化日期格式的字符串:20180324
need_time_string = time.strftime("%Y%m%d", trans_time)

目前为止,我们可以根据一个日期参数,得到链接中的大部分。

登录日志服务器

既然我们说下载,肯定要登录到日志服务器上去下载。所以登录日志服务器的操作是避免不了的。登录操作至少需要使用到ftp服务器的ip,登录用户名与密码三项。所以这三个参数也是少不了的。我们使用python的ftplib库来进行操作
# 初始化ftp操作对象
f = ftplib.FTP(host)
# 登录ftp服务器
f.login(user=username, passwd=password)

通过分析文件路径那一步,我们已经可以得到目标文件存储的目录:/admin/2018/ttt/03/
我们要做的就是,进入到这个目录里

f.cwd(ori_directory)

选择目标文件

我们已经到了目标的文件夹,现在我们需要选择合适的数据。我们是分布式得到应用,一般不会部署一个实例,至少两台,那么我们的日志是“192.168.100.05-20180324.log”与“192.168.100.04-20180324.log”,这两个只是都是3月24号的,我们都需要获取到,前面我们已经获取到了20180324这个字符串,所以我们需要在这个目录中寻找文件名称包含20180324的文件名。我们也是这么做的
# 列出目录中的所有文件名,放到file_list中
file_list = f.nlst()
# 过滤file_list中的包含20180324的文件名,数据放到need_files中
need_files = list(filter(lambda x: True if need_time_string in x else False, file_list))  

下载文件

找到后我们就是下载,那么我们需要下载到本地的什么地方呢?所以需要设置一个本地的文件夹的地址,如果不存在,创建此目录。下载文件到这个目录中
# 如果不存在,创建本地目录
if not os.path.exists(des_directory):
    os.makedirs(des_directory)
# 切换到本地目录中
os.chdir(des_directory)
for fileName in need_files:
    # 下载到本地
    f.retrbinary('RETR %s' % fileName, open(fileName, 'wb').write)

OK,以上就是我们操作流程,完整的脚本是

def getHistoryServerLog(des_directory, host, username, password, project_name, log_time):
    print("下载到本地目录:%s,主机IP:%s,用户名:%s,密码:%s,项目名称:%s,日志时间:%s" % (
        des_directory, host, username, password, project_name, log_time))
    print("===============下载开始==============")
    trans_time = time.strptime(log_time, '%Y-%m-%d')
    year = time.strftime('%Y', trans_time)
    month = time.strftime('%m', trans_time)
    need_time_string = time.strftime("%Y%m%d", trans_time)
    ori_directory = '/admin/' + year + "/" + project_name + "/" + month

    f = ftplib.FTP(host)
    f.login(user=username, passwd=password)
    f.cwd(ori_directory)

    file_list = f.nlst()
    need_files = list(filter(lambda x: True if need_time_string in x else False, file_list))
    if not os.path.exists(des_directory):
        os.makedirs(des_directory)
    os.chdir(des_directory)
    for fileName in need_files:
        f.retrbinary('RETR %s' % fileName, open(fileName, 'wb').write)
    f.close()
    print("===============下载完成==============")

大家可以试着用起来啊.

相关文章

网友评论

    本文标题:基于python3下载生产日志

    本文链接:https://www.haomeiwen.com/subject/trvocftx.html