资讯专栏INFORMATION COLUMN

使用Python解析阿里云CDN日志

Zhuxy / 3622人阅读

摘要:某些原因,一开始没有设计网站的统计模块如今需要加上,只能借助于百度统计或者阿里云的日志文件,阿里云的日志文件是的访问信息时间访问回源访问命中状态头文件类型将单条记录转换为对象时间访问回源响应时间请求地址请求大小响应大小缓存状态

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

log

</>复制代码

  1. [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

</>复制代码

  1. # 将单条记录转换为Dict对象
  2. def line2dict(line):
  3. # Snippet, thanks to http://www.seehuhn.de/blog/52
  4. parts = [
  5. r"[(?P
  6. r"(?PS+)", # 访问IP %h
  7. r"(?PS+)", # 回源IP %h
  8. r"(?P[0-9]+)", # 响应时间 %>s
  9. r""(?P.*)"", # Referer "%{Referer}i"
  10. r""(?P.+)"", # 请求地址 "%r"
  11. r"(?P[0-9]+)", # Httpcode %>s
  12. r"(?PS+)", # 请求大小 %b (careful, can be "-")
  13. r"(?P[0-9]+)", # 响应大小 size %>s
  14. r"(?PS+)", # 缓存状态 %s
  15. r""(?P.*)"", # user agent "%{User-agent}i"
  16. r""(?P.*)"", # content type "%{Content-type}i"
  17. ]
  18. pattern = re.compile(r"s+".join(parts) + r"s*")
  19. m = pattern.match(line)
  20. res = m.groupdict()
  21. return res
script

AliyunLog.py

</>复制代码

  1. # coding=utf-8
  2. import fileinput
  3. import re
  4. import os
  5. try:
  6. import simplejson as json
  7. except ImportError:
  8. import json
  9. # 读取输入文件并返回Dict对象
  10. def readfile(file):
  11. filecontent = {}
  12. index = 0
  13. statinfo = os.stat(file)
  14. # just a guestimate. I believe a single entry contains atleast 150 chars
  15. if statinfo.st_size < 150:
  16. print "Not a valid log file. It does not have enough data"
  17. else:
  18. for line in fileinput.input(file):
  19. index = index + 1
  20. if line != "
  21. ": # don"t read newlines
  22. filecontent[index] = line2dict(line)
  23. fileinput.close()
  24. return filecontent
  25. # 将单条记录转换为Dict对象
  26. def line2dict(line):
  27. # Snippet, thanks to http://www.seehuhn.de/blog/52
  28. parts = [
  29. r"[(?P
  30. r"(?PS+)", # 访问IP %h
  31. r"(?PS+)", # 回源IP %h
  32. r"(?P[0-9]+)", # 响应时间 %>s
  33. r""(?P.*)"", # Referer "%{Referer}i"
  34. r""(?P.+)"", # 请求地址 "%r"
  35. r"(?P[0-9]+)", # Httpcode %>s
  36. r"(?PS+)", # 请求大小 %b (careful, can be "-")
  37. r"(?P[0-9]+)", # 响应大小 size %>s
  38. r"(?PS+)", # 缓存状态 %s
  39. r""(?P.*)"", # user agent "%{User-agent}i"
  40. r""(?P.*)"", # content type "%{Content-type}i"
  41. ]
  42. pattern = re.compile(r"s+".join(parts) + r"s*")
  43. m = pattern.match(line)
  44. res = m.groupdict()
  45. return res
  46. # 转换整个记录为Json对象
  47. def toJson(file):
  48. entries = readfile(file)
  49. return json.JSONEncoder(indent=4).encode(entries)

main.py

</>复制代码

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. import sys
  4. from AliyunLog import *
  5. def main():
  6. if len(sys.argv) < 3:
  7. print "Incorrect Syntax. Usage: python main.py -f "
  8. sys.exit(2)
  9. elif sys.argv[1] != "-f":
  10. print "Invalid switch "" + sys.argv[1] + """
  11. sys.exit(2)
  12. elif os.path.isfile(sys.argv[2]) == False:
  13. print "File does not exist"
  14. sys.exit(2)
  15. print toJson(sys.argv[2])
  16. if __name__ == "__main__":
  17. main()
result run script

</>复制代码

  1. python main.py -f data
terminal

</>复制代码

  1. {
  2. "6432": {
  3. "res_time": "1728",
  4. "res_ip": "118.114.213.118",
  5. "req_size": "768",
  6. "req_url": "GET http://cloud.insta360.com/public/media/mp4/f9e4bf15d452440c2884b234854d089c_audio.mp3",
  7. "origin_ip": "-",
  8. "referer": "http://cloud.insta360.com/post/f9e4bf15d452440c2884b234854d089c?m=true&from=timeline&isappinstalled=0",
  9. "content_type": "audio/mpeg",
  10. "time": "9/Mar/2016:00:59:58 +0800",
  11. "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",
  12. "http_code": "206",
  13. "res_size": "5290084",
  14. "cache_status": "HIT"
  15. },
  16. ...
  17. }
more

参考了github上apache log的解析方法

原文地址:parse-aliyun-cdn-log-file-with-python

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37815.html

相关文章

  • 深度解析Tengine的调试与资源监控方法论

    摘要:是由淘宝网发起的服务器项目。回源监控是内容分发网络的简称,其分发的内容来自用户源站,负责回源的模块是最重要组成部分之一,使跨越单机的限制,完成网络数据的接收处理和转发。这部分主要介绍的一些调试技巧和回源资源监控的内容,以及相应的实例分享。 摘要: Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,提供更强大的流量负载均衡能力、全站HTTPS...

    everfight 评论0 收藏0
  • 上海栖:金融政企行业的CDN最佳实践

    摘要:摘要在刚刚结束的上海云栖大会飞天技术汇分论坛上,阿里云视频云产品架构师罗小飞进行了阿里云面向金融政企的最佳实践主题分享,为上海的嘉宾介绍的解决方案与技术服务体系。随后,年阿里云宣布全面降价,打破了行业原有的价格不透明一客一价的模式。 摘要: 在刚刚结束的上海云栖大会飞天技术汇分论坛上,阿里云视频云产品架构师罗小飞进行了《阿里云CDN——面向金融政企的CDN最佳实践》主题分享,为上海的嘉...

    Kahn 评论0 收藏0
  • 上海栖:金融政企行业的CDN最佳实践

    摘要:摘要在刚刚结束的上海云栖大会飞天技术汇分论坛上,阿里云视频云产品架构师罗小飞进行了阿里云面向金融政企的最佳实践主题分享,为上海的嘉宾介绍的解决方案与技术服务体系。随后,年阿里云宣布全面降价,打破了行业原有的价格不透明一客一价的模式。 摘要: 在刚刚结束的上海云栖大会飞天技术汇分论坛上,阿里云视频云产品架构师罗小飞进行了《阿里云CDN——面向金融政企的CDN最佳实践》主题分享,为上海的嘉...

    chengtao1633 评论0 收藏0
  • 阿里高级技术专家空见: CDN的数据化之路

    摘要:数据出来后,阿里云还要在全球范围内调度流量,一丝一毫的不准确都可能导致很严重的后果,所以对于数据的准确性要求很高。阿里云更多的是做实时数据分析。 想要实现优质高速的互联网视频服务,一定离不开高质量的内容分发网络服务,就是我们常说的CDN,在10月13日云栖大会视频多媒体分论坛上,阿里云高级技术专家空见为大家讲解了CDN服务过程中,数据处理、安全监测、日志分析、智能分析是如何为CDN赋能...

    番茄西红柿 评论0 收藏0
  • 阿里高级技术专家空见: CDN的数据化之路

    摘要:数据出来后,阿里云还要在全球范围内调度流量,一丝一毫的不准确都可能导致很严重的后果,所以对于数据的准确性要求很高。阿里云更多的是做实时数据分析。 想要实现优质高速的互联网视频服务,一定离不开高质量的内容分发网络服务,就是我们常说的CDN,在10月13日云栖大会视频多媒体分论坛上,阿里云高级技术专家空见为大家讲解了CDN服务过程中,数据处理、安全监测、日志分析、智能分析是如何为CDN赋能...

    rollback 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<