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 相关文章推荐
使用grappelli为django admin后台添加模板
Nov 18 Python
Python中的os.path路径模块中的操作方法总结
Jul 07 Python
通过Python爬虫代理IP快速增加博客阅读量
Dec 14 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
100行python代码实现跳一跳辅助程序
Jan 15 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
Python列表解析操作实例总结
Feb 26 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
Python 连接 MySQL 的几种方法
Sep 09 Python
Python创建文件夹与文件的快捷方法
Dec 08 Python
Python深度学习之实现卷积神经网络
Jun 05 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 编程的 5个良好习惯
2009/02/20 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
学习python处理python编码问题
2011/03/13 Python
Python获取当前时间的方法
2014/01/14 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
python对视频画框标记后保存的方法
2018/12/07 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
Python和Bash结合在一起的方法
2020/11/13 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
澳洲的服装老品牌:SABA
2018/02/06 全球购物
荷兰手表网站:Watch2Day
2018/07/02 全球购物
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
介绍一些UNIX常用简单命令
2014/11/11 面试题
家庭贫困证明范本(经典版)
2014/09/22 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电