Python脚本实现下载合并SAE日志


Posted in Python onFebruary 10, 2015

由于一些原因,需要SAE上站点的日志文件,从SAE上只能按天下载,下载下来手动处理比较蛋疼,尤其是数量很大的时候。还好SAE提供了API可以批量获得日志文件下载地址,刚刚写了python脚本自动下载和合并这些文件

调用API获得下载地址

文档位置在这里

设置自己的应用和下载参数

请求中需要设置的变量如下

api_url = 'http://dloadcenter.sae.sina.com.cn/interapi.php?'

appname = 'xxxxx'

from_date = '20140101'

to_date = '20140116'

url_type = 'http' # http|taskqueue|cron|mail|rdc

url_type2 = 'access' # only when type=http  access|debug|error|warning|notice|resources

secret_key = 'xxxxx'

生成请求地址

请求地址生成方式可以看一下官网的要求:

1.将参数排序
2.生成请求字符串,去掉&
3.附加access_key
4.请求字符串求md5,形成sign
5.把sign增加到请求字符串中

具体实现代码如下

params = dict()

params['act'] = 'log'

params['appname'] = appname

params['from'] = from_date

params['to'] = to_date

params['type'] = url_type
if url_type == 'http':

    params['type2'] = url_type2
params = collections.OrderedDict(sorted(params.items()))
request = ''

for k,v in params.iteritems():

    request += k+'='+v+'&'
sign = request.replace('&','')

sign += secret_key
md5 = hashlib.md5()

md5.update(sign)

sign = md5.hexdigest()
request = api_url + request + 'sign=' + sign
if response['errno'] != 0:

    print '[!] '+response['errmsg']

    exit()
print '[#] request success'

下载日志文件

SAE将每天的日志文件都打包成tar.gz的格式,下载保存下来即可,文件名以日期.tar.gz命名

log_files = list()
for down_url in response['data']:    

    file_name = re.compile(r'\d{4}-\d{2}-\d{2}').findall(down_url)[0] + '.tar.gz'

    log_files.append(file_name)

    data = urllib2.urlopen(down_url).read()

    with open(file_name, "wb") as file:

        file.write(data)
print '[#] you got %d log files' % len(log_files)

合并文件

合并文件方式用trafile库解压缩每个文件,然后把文件内容附加到access_log下就可以了

# compress these files to access_log

access_log = open('access_log','w');
for log_file in log_files:

    tar = tarfile.open(log_file)

    log_name = tar.getnames()[0]

    tar.extract(log_name)

    # save to access_log

    data = open(log_name).read()

    access_log.write(data)

    os.remove(log_name)
print '[#] all file has writen to access_log'

完整代码

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Author: Su Yan <http://yansu.org>

# @Date:   2014-01-17 12:05:19

# @Last Modified by:   Su Yan

# @Last Modified time: 2014-01-17 14:15:41
import os

import collections

import hashlib

import urllib2

import json

import re

import tarfile
# settings

# documents http://sae.sina.com.cn/?m=devcenter&catId=281

api_url = 'http://dloadcenter.sae.sina.com.cn/interapi.php?'

appname = 'yansublog'

from_date = '20140101'

to_date = '20140116'

url_type = 'http' # http|taskqueue|cron|mail|rdc

url_type2 = 'access' # only when type=http  access|debug|error|warning|notice|resources

secret_key = 'zwzim4zhk35i50003kz2lh3hyilz01m03515j0i5'
# encode request

params = dict()

params['act'] = 'log'

params['appname'] = appname

params['from'] = from_date

params['to'] = to_date

params['type'] = url_type
if url_type == 'http':

    params['type2'] = url_type2
params = collections.OrderedDict(sorted(params.items()))
request = ''

for k,v in params.iteritems():

    request += k+'='+v+'&'
sign = request.replace('&','')

sign += secret_key
md5 = hashlib.md5()

md5.update(sign)

sign = md5.hexdigest()
request = api_url + request + 'sign=' + sign
# request api

response = urllib2.urlopen(request).read()

response = json.loads(response)
if response['errno'] != 0:

    print '[!] '+response['errmsg']

    exit()
print '[#] request success'
# download and save files

log_files = list()
for down_url in response['data']:    

    file_name = re.compile(r'\d{4}-\d{2}-\d{2}').findall(down_url)[0] + '.tar.gz'

    log_files.append(file_name)

    data = urllib2.urlopen(down_url).read()

    with open(file_name, "wb") as file:

        file.write(data)
print '[#] you got %d log files' % len(log_files)
# compress these files to access_log

access_log = open('access_log','w');
for log_file in log_files:

    tar = tarfile.open(log_file)

    log_name = tar.getnames()[0]

    tar.extract(log_name)

    # save to access_log

    data = open(log_name).read()

    access_log.write(data)

    os.remove(log_name)
print '[#] all file has writen to access_log'
Python 相关文章推荐
python模拟登陆阿里妈妈生成商品推广链接
Apr 03 Python
Python的ORM框架SQLObject入门实例
Apr 28 Python
python3+PyQt5实现拖放功能
Apr 24 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
屏蔽Django admin界面添加按钮的操作
Mar 11 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 04 Python
详解Python牛顿插值法
May 11 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 Python
Python常用内置函数总结
Feb 08 #Python
Python文件和目录操作详解
Feb 08 #Python
Python中操作MySQL入门实例
Feb 08 #Python
Python Web框架Flask下网站开发入门实例
Feb 08 #Python
Python中使用wxPython开发的一个简易笔记本程序实例
Feb 08 #Python
Python常用的日期时间处理方法示例
Feb 08 #Python
Python中使用PIL库实现图片高斯模糊实例
Feb 08 #Python
You might like
php 面试碰到过的问题 在此做下记录
2011/06/09 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
Win下如何安装PHP的APC拓展
2013/08/07 PHP
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
2017/03/25 jQuery
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
基于jQuery的表单填充实例
2017/08/22 jQuery
基于nodejs实现微信支付功能
2017/12/20 NodeJs
Vue Element 分组+多选+可搜索Select选择器实现示例
2018/07/23 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
MySQL最常见的操作语句小结
2015/05/07 Python
Python进程间通信之共享内存详解
2017/10/30 Python
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Jupyter Notebook 安装配置与使用详解
2021/01/06 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
教师年终个人自我评价
2013/10/04 职场文书
项目合作计划书
2014/01/09 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
小学开学标语
2014/07/01 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
公司承诺书格式范文
2015/04/28 职场文书
python基础之错误和异常处理
2021/10/24 Python
MySQL面试题讲解之如何设置Hash索引
2021/11/01 MySQL