使用Python解析阿里云CDN日志

某些原因,一开始没有设计网站的统计模块
如今需要加上,只能借助于百度统计或者阿里云的cdn日志文件,阿里云cdn的日志文件是web的访问信息

#log

[9/Mar/2016:00:00:16 +0800] 222.171.7.89 - 62113 "http://cloud.insta360.com/post/5e7b029d8ed7e3c4b23006a71bab73c8?e=true&m=true" "GET http://cloud.insta360.com/public/media/mp4/5e7b029d8ed7e3c4b23006a71bab73c8_960x480.mp4" 206 509 20516390 HIT "Mozilla/5.0 (iPhone; CPU iPhone OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H321 NewsApp/5.3.2" "video/mp4"

#fileds

  • 时间
  • 访问IP
  • 回源IP
  • responsetime
  • referer
  • method
  • 访问URL
  • httpcode
  • requestsize
  • responsesize
  • cache命中状态
  • UA头
  • 文件类型

#re

# 将单条记录转换为Dict对象
def line2dict(line):
    # Snippet, thanks to http://www.seehuhn.de/blog/52
    parts = [
        r'\[(?P<time>.+)\]',        # 时间 %t
        r'(?P<res_ip>\S+)',         # 访问IP %h
        r'(?P<origin_ip>\S+)',      # 回源IP %h
        r'(?P<res_time>[0-9]+)',    # 响应时间 %>s
        r'"(?P<referer>.*)"',       # Referer "%{Referer}i"
        r'"(?P<req_url>.+)"',       # 请求地址 "%r"
        r'(?P<http_code>[0-9]+)',   # Httpcode %>s
        r'(?P<req_size>\S+)',       # 请求大小 %b (careful, can be '-')
        r'(?P<res_size>[0-9]+)',    # 响应大小 size %>s
        r'(?P<cache_status>\S+)',   # 缓存状态 %s
        r'"(?P<ua>.*)"',            # user agent "%{User-agent}i"
        r'"(?P<content_type>.*)"',  # content type "%{Content-type}i"
    ]
    pattern = re.compile(r'\s+'.join(parts) + r'\s*\Z')
    m = pattern.match(line)
    res = m.groupdict()
    return res

#script

AliyunLog.py

# coding=utf-8

import fileinput
import re
import os

try:
    import simplejson as json
except ImportError:
    import json

# 读取输入文件并返回Dict对象
def readfile(file):
    filecontent = {}
    index = 0
    statinfo = os.stat(file)

    # just a guestimate. I believe a single entry contains atleast 150 chars
    if statinfo.st_size < 150:
        print "Not a valid log file. It does not have enough data"
    else:
        for line in fileinput.input(file):
            index = index + 1
            if line != "\n":  # don't read newlines
                filecontent[index] = line2dict(line)

        fileinput.close()
    return filecontent

# 将单条记录转换为Dict对象
def line2dict(line):
    # Snippet, thanks to http://www.seehuhn.de/blog/52
    parts = [
        r'\[(?P<time>.+)\]',        # 时间 %t
        r'(?P<res_ip>\S+)',         # 访问IP %h
        r'(?P<origin_ip>\S+)',      # 回源IP %h
        r'(?P<res_time>[0-9]+)',    # 响应时间 %>s
        r'"(?P<referer>.*)"',       # Referer "%{Referer}i"
        r'"(?P<req_url>.+)"',       # 请求地址 "%r"
        r'(?P<http_code>[0-9]+)',   # Httpcode %>s
        r'(?P<req_size>\S+)',       # 请求大小 %b (careful, can be '-')
        r'(?P<res_size>[0-9]+)',    # 响应大小 size %>s
        r'(?P<cache_status>\S+)',   # 缓存状态 %s
        r'"(?P<ua>.*)"',            # user agent "%{User-agent}i"
        r'"(?P<content_type>.*)"',  # content type "%{Content-type}i"
    ]
    pattern = re.compile(r'\s+'.join(parts) + r'\s*\Z')
    m = pattern.match(line)
    res = m.groupdict()
    return res

# 转换整个记录为Json对象
def toJson(file):
    entries = readfile(file)
    return json.JSONEncoder(indent=4).encode(entries)

main.py

#!/usr/bin/env python
# coding=utf-8

import sys
from AliyunLog import *

def main():
    if len(sys.argv) < 3:
        print "Incorrect Syntax. Usage: python main.py -f <filename>"
        sys.exit(2)
    elif sys.argv[1] != "-f":
        print "Invalid switch '" + sys.argv[1] + "'"
        sys.exit(2)
    elif os.path.isfile(sys.argv[2]) == False:
        print "File does not exist"
        sys.exit(2)

    print toJson(sys.argv[2])

if __name__ == "__main__":
    main()

#result

run script

python main.py -f data

terminal


{
    "6432": {
        "res_time": "1728",
        "res_ip": "118.114.213.118",
        "req_size": "768",
        "req_url": "GET http://cloud.insta360.com/public/media/mp4/f9e4bf15d452440c2884b234854d089c_audio.mp3",
        "origin_ip": "-",
        "referer": "http://cloud.insta360.com/post/f9e4bf15d452440c2884b234854d089c?m=true&from=timeline&isappinstalled=0",
        "content_type": "audio/mpeg",
        "time": "9/Mar/2016:00:59:58 +0800",
        "ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13C75 MicroMessenger/6.3.13 NetType/WIFI Language/zh_CN",
        "http_code": "206",
        "res_size": "5290084",
        "cache_status": "HIT"
    },
    ...
}

#more

时间: 2024-09-13 01:42:49

使用Python解析阿里云CDN日志的相关文章

阿里云 CDN 504错误几种解决方法

    最近帮朋友公司的网站配置阿里云CDN服务.开通阿里云CDN,并把域名的CName解析到阿里云指定的域名后,运行一段时间,发现 CDN后台很多504错误提示.      一般代理服务器出现504错误,是web后端服务器无响应,或者响应超时造成的.所以根据以上逐步分析解决. 1.修改本地电脑hosts,把域名直接指向服务器IP,访问服务器速度是否正常,如果不正常,说明服务器配置低或者服务器分配给网站的资源已使用差不多啦!此时建议升级服务器配置,或者优化web服务: 2.如果是cdn加速的域名

阿里云 CDN HTTPS 最佳实践系列——HTTP/2(二)

背景 HTTP/2 是最新的 HTTP 协议,已于2015年5月份正式发布,Chrome. IE11.Safari 以及 Firefox 等主流浏览器已经支持 HTTP/2 协议.阿里云 CDN 在2016年7月份开始全网支持 HTTP/2,是国内第一家全网支持 HTTP/2 的 CDN 提供商. HTTP/2 是新技术,一些底层代码库在实现时可能不完善,在一些特殊场景下可能就出问题,我们遇到过一些 android 库实现有问题,导致开启 HTTP/2 就经常访问失败,关闭 HTTP/2 就完全

姚伟斌:阿里云CDN技术演变之路

2015年1月31日,阿里云课堂第六期在北京开课,"大型互联网应用架构之存储与分发"主题分享在众多朋友的期待下精彩上演,现场观众再次爆满.本次活动中,姚伟斌(花名:文景)和李文兆两位讲师为大家献上了精彩演讲,并在OpenSpace环节与观众展开讨论,积极互动.应广大用户要求,我们将云课堂讲师现场分享内容全文整理出来,供大家参考.阿里云课堂会继续在全国各地陆续开课,欢迎大家继续支持!   以下为讲师姚伟斌(花名:文景)的分享内容:   我前面会讲一下CDN的用途,也会讲一些CDN产品,在

阿里云讲师姚伟斌浅谈阿里云CDN技术演变之路

2015年1月31日,阿里云课堂第六期在北京开课,"大型互联网应用架构之存储与分发"主题分享在众多朋友的期待下精彩上演,现场观众再次爆满.本次活动中,姚伟斌(花名:文景)和李文兆两位讲师为大家献上了精彩演讲,并在OpenSpace环节与观众展开讨论,积极互动.应广大用户要求,我们将云课堂讲师现场分享内容全文整理出来,供大家参考.阿里云课堂会继续在全国各地陆续开课,欢迎大家继续支持! 以下为讲师姚伟斌(花名:文景)的分享内容: 我前面会讲一下CDN的用途,也会讲一些CDN产品,在后面我会

阿里云CDN的双11进化论

阿里云CDN的双11进化论 从2009年11月11日开始,双11从最初的淘宝商城到后来的天猫商城购物促销活动,到后来演变成为中国各大购物网站全国性的购物狂坏,成为广大顾客购物的盛大节日.双11的成交额也从最初的不到1亿,呈指数上升,一直上涨到2015年的912亿,直到今年突破千亿大关.成交额节节攀升背后的技术,是整个阿里集团成千上万技术工程师的努力结果.    一般来说,双11的峰值请求数是平时的数十倍,你可以想象数千万人同时访问同一个网站,产生的并发访问,对于整个互联网基础设施的考验是非常巨大

阿里云 CDN HTTPS 最佳实践系列——动态证书(一)

背景 了解阿里云 CDN 架构的朋友应该知道,阿里云 CDN 7层的接入组件是 Tengine,我们知道 Tengine 原生是支持 SSL 的,只需要在配置文件中配置证书和私钥即可.在 CDN HTTPS 产品化以前,要开通 HTTPS 的域名需要把证书私钥给我们,我们在 Tengine 静态配置中配置,然后再同步到所有 CDN 边缘节点,显然这种方式在越来越多的域名开通 HTTPS 后,Tengine 静态配置文件会越来越大,难以管理,同时也会导致 Tengine reload 变得很慢,这

阿里云CDN HTTPS安全加速解决方案发布,价格下调50%

日前,阿里云CDN产品HTTPS安全加速解决方案正式发布,请求数计费官方价格下调50%,后付费价格为0.05元/万次HTTPS请求,并且新增了1亿.10亿.100亿规格的预付费请求包,分别售价为450.4000.35000元,再次释放技术红利普惠广大用户. 据了解,阿里云CDN产品面向用户提供HTTPS安全加速解决方案,可有效防止网站内容被篡改被劫持,加强网站的安全性.用户仅需要开启安全加速模式后上传加速域名证书/私钥,机会可以实现全网数据加密传输.同时,阿里云官方显示,CDN目前已全平台支持h

阿里云CDN的双11再进化

从2009年11月11日开始,双11从最初的淘宝商城到后来的天猫商城购物促销活动,到后来演变成为中国各大购物网站全国性的购物狂坏,成为广大顾客购物的盛大节日.双11的成交额也从最初的不到1亿,呈指数上升,一直上涨到2015年的912亿,去年突破千亿,2017年达到1682亿元!成交额节节攀升背后的技术,是整个阿里集团成千上万技术工程师的努力结果. 一般来说,双11的峰值请求数是平时的数十倍,你可以想象数千万人同时访问同一个网站,产生的并发访问,对于整个互联网基础设施的考验是非常巨大的,而通过阿里

阿里云 CDN HTTPS 最佳实践——动态密钥套件(三)

背景 在 ssllabs 中可以测试域名的 SSL 安全等级: 影响这个测试等级的最主要因素就是密钥套件,在接入阿里云 CDN 的所有域名中,绝大多数域名评级都是 A,但是有少数域名为了兼容一些老浏览器或者客户端,需要支持比如 RC4 这样的加密算法,这样就导致评级为 B,但用户体验更重要,这就需要为这些对密钥套件有特殊需求的域名特殊配置密钥套件. 另外,当我们调试 https 时,比如抓包分析数据包时,发现应用数据都是加密的,无法分析 HTTP 协议的问题,但是如果我们有私钥,那就有办法可以通