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实现文件路径和url相互转换的方法
Jul 06 Python
各个系统下的Python解释器相关安装方法
Oct 12 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
Python如何生成树形图案
Jan 03 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
Python中list循环遍历删除数据的正确方法
Sep 02 Python
python 实现目录复制的三种小结
Dec 04 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
Nov 05 Python
Python jieba库分词模式实例用法
Jan 13 Python
Opencv实现二维直方图的计算及绘制
Jul 21 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下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
php遍历数组的方法分享
2012/03/22 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
浅谈$('div a') 与$('div&gt;a')的区别
2016/07/18 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
vue实现循环切换动画
2018/10/17 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
Python中扩展包的安装方法详解
2017/06/14 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
python K近邻算法的kd树实现
2018/09/06 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
shell变量的作用空间是什么
2013/08/17 面试题
金榜题名主持词
2015/07/02 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
《家》读后感:万惜拯救,冷暖自知
2019/09/25 职场文书
git中cherry-pick命令的使用教程
2022/06/25 Servers