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 元组(Tuple)操作详解
Mar 11 Python
python网络编程之数据传输UDP实例分析
May 20 Python
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
对pandas的算术运算和数据对齐实例详解
Dec 22 Python
通过pykafka接收Kafka消息队列的方法
Dec 27 Python
Django处理多用户类型的方法介绍
May 18 Python
解决ROC曲线画出来只有一个点的问题
Feb 28 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
Nov 05 Python
Python: glob匹配文件的操作
Dec 11 Python
详解Python描述符的工作原理
Jun 11 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
破解图片防盗链的代码(asp/php)测试通过
2010/07/02 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
php框架知识点的整理和补充
2021/03/01 PHP
原型方法的不同写法居然会影响调试的解决方法
2007/03/08 Javascript
jquery 表单取值常用代码
2009/12/22 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
Tesserocr库的正确安装方式
2018/10/19 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
python开发前景如何
2020/06/11 Python
Python代码注释规范代码实例解析
2020/08/14 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
德国高性价比网上药店:medpex
2017/07/09 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
远程研修随笔感言
2014/02/10 职场文书
python Polars库的使用简介
2021/04/21 Python
redis实现共同好友的思路详解
2021/05/26 Redis
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers