生产环境可能会遇到各种问题,最常用也是最有效的排查方式就是查看生产日志。但是有的生产日志是放到归档的日志服务器上,这就需要我们去下载。操作很繁琐,无非就是登陆日志服务器,找到日志文件,下载。只要是繁琐的重复性的内容都可以通过程序来解决(至少我是这么认为的),今天我们就利用python3来实现一下这个功能。
观察文件路径
一般来说,针对日志服务器存放的文件都会有一定的规律,比如说常见的就是年
、月
、日
、项目名
作为文件路径的元素。例如:/admin/2018/ttt/03/192.168.100.04-20180324.log,其中ttt代表了项目名称。
分析文件路径
得到了这个路径后,我们就得知道该怎么拼接得到这个路径。首先/admin/这个路径是固定的,所以我们不需要特别处理。2018
与03
与20180324
这些数据,我们可以通过方法的入参传递过来,我们需要的仅仅就是一个日志的时间即可。我们的日志时间入参为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("===============下载完成==============")
大家可以试着用起来啊.
网友评论