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发送邮件示例(支持中文邮件标题)
Feb 16 Python
Python对两个有序列表进行合并和排序的例子
Jun 13 Python
Python常用正则表达式符号浅析
Aug 13 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
Python求算数平方根和约数的方法汇总
Mar 09 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
Python查看微信撤回消息代码
Jun 07 Python
创建Django项目图文实例详解
Jun 06 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
python 利用matplotlib在3D空间中绘制平面的案例
Feb 06 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扩展介绍与开发教程
2010/08/19 PHP
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
JS实现复制功能
2017/03/01 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
Python中使用ElementTree解析XML示例
2015/06/02 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
浅析Python四种数据类型
2018/09/26 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
小学生演讲稿
2014/01/12 职场文书
家长对孩子评语
2014/01/30 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
竞聘演讲稿
2014/04/24 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server