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 相关文章推荐
python2.7删除文件夹和删除文件代码实例
Dec 18 Python
python使用cStringIO实现临时内存文件访问的方法
Mar 26 Python
详谈python read readline readlines的区别
Sep 22 Python
答题辅助python代码实现
Jan 16 Python
详解Python核心对象类型字符串
Feb 11 Python
Python多线程原理与用法详解
Aug 20 Python
python学生管理系统
Jan 30 Python
Python 线程池用法简单示例
Oct 02 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
Python-openCV开运算实例
Jul 05 Python
python 基于Apscheduler实现定时任务
Dec 15 Python
使用OpenCV实现人脸图像卡通化的示例代码
Jan 15 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
php 文件夹删除、php清除缓存程序
2009/08/25 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
php中curl使用指南
2015/02/05 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
JavaScript Array扩展实现代码
2009/10/14 Javascript
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
2016/12/30 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
跟老齐学Python之网站的结构
2014/10/24 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
Hammitt官网:设计师手袋
2020/05/23 全球购物
校友会欢迎辞
2014/01/13 职场文书
实习生岗位职责
2014/04/12 职场文书
创建绿色学校先进个人材料
2014/08/20 职场文书
委托证明书
2014/09/17 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
教师工作证明范本
2015/06/12 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang