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 22 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
python 判断是否为正小数和正整数的实例
Jul 23 Python
python实现推箱子游戏
Mar 25 Python
python绘制多个子图的实例
Jul 07 Python
Python使用Numpy模块读取文件并绘制图片
May 13 Python
Python实现寻找回文数字过程解析
Jun 09 Python
python删除文件、清空目录的实现方法
Sep 23 Python
Python3获取cookie常用三种方案
Oct 05 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 Python
python+openCV对视频进行截取的实现
Nov 27 Python
python 基于opencv 绘制图像轮廓
Dec 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
一道关于php变量引用的面试题
2010/08/08 PHP
一段实用的php验证码函数
2016/05/19 PHP
PHP云打印类完整示例
2016/10/15 PHP
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
js实现全选和全不选
2020/07/28 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
python 多个参数不为空校验方法
2019/02/14 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
10个示例带你掌握python中的元组
2020/11/23 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
建筑施工实习自我鉴定
2013/09/19 职场文书
幼儿如何来做好自我评价
2013/11/05 职场文书
退休教师追悼词
2015/06/23 职场文书