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中的True,False条件判断实例分析
Jan 12 Python
用Python给文本创立向量空间模型的教程
Apr 23 Python
Django自定义manage命令实例代码
Feb 11 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
django框架面向对象ORM模型继承用法实例分析
Jul 29 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
查看端口并杀进程python脚本代码
Dec 17 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
Python @property原理解析和用法实例
Feb 11 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
基于Python模拟浏览器发送http请求
Nov 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
世界上第一台立体声收音机
2021/03/01 无线电
PHP脚本的10个技巧(2)
2006/10/09 PHP
php数组(array)输出的三种形式详解
2013/06/05 PHP
php发送post请求函数分享
2014/03/06 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
2016/02/03 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
python距离测量的方法
2018/03/06 Python
python pytest进阶之fixture详解
2019/06/27 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
Python while true实现爬虫定时任务
2020/06/08 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
Python中Qslider控件实操详解
2021/02/20 Python
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
如何将字串String转换成整数int
2015/02/21 面试题
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
产假请假条
2014/04/10 职场文书
课外访万家心得体会
2014/09/03 职场文书
五好文明家庭事迹材料
2014/12/20 职场文书
学习保证书怎么写
2015/02/26 职场文书
新学期主题班会
2015/08/17 职场文书