全部产品
云市场

读取CDN日志数据

更新时间:2020-04-06 16:11:39

背景信息

阿里云内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。CDN分担源站压力,避免网络拥塞,确保在不同区域、不同场景下加速网站内容的分发,提高资源访问速度。您可以将CDN日志转存到OSS,或者将CDN日志实时投递到日志服务,然后将日志服务中的CDN日志投递到OSS。接下来您就可以在不移动日志文件的情况下通过DLA分析OSS中的CDN日志数据,及时发现问题,并有针对性的解决问题,提升CDN服务质量。

前提条件

通过DLA分析CDN日志数据之前,您需要先完成以下准备工作。

函数计算

开通函数计算服务

OSS

  1. 开通OSS服务

  2. 创建Bucket

  3. 新建文件夹

    根据业务需求,判断是否需要新建文件夹,将CDN转存过来的日志存储在新建文件夹中。

DLA

  1. 开通DLA服务

  2. 初始化DLA数据库主账号密码

实施步骤

步骤一:将CDN日志转存到OSS

参照日志转存将CDN日志转存到OSS。

步骤二:创建OSS Schema

假设OSS Bucket中存储了以下CDN日志文件。

cdn日志

您可以在DMS页面编写SQL创建OSS Schema、创建日志文件表以及读取日志文件数据,也可以通过MySQL客户端或者MySQL命令行工具连接DLA,然后编写SQL创建OSS Schema、创建日志文件表以及读取日志文件数据。

  1. CREATE SCHEMA cdn_log_schema with DBPROPERTIES(
  2. catalog='oss',
  3. location = 'oss://bucket-name/cdn/'
  4. );

步骤三:创建日志文件表

CDN日志文件数据如下所示。

  1. [9/Jun/2015:01:58:09 +0800] 188.165.15.75 - 1542 "-" "GET http://www.aliyun.com/index.html" 200 191 2830 MISS "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)" "text/html"

日志字段含义如下表所示。

字段说明
[9/Jun/2015:01:58:09 +0800]时间
188.165.15.75访问IP地址
-代理IP
1542responsetime(单位:ms)
"-"referer
"GET http://www.aliyun.com/index.html"request
200httpcode
191requestsize(单位:byte)
2830responsesize(单位:byte)
MISScache命中状态
"Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"UA头
"text/html"文件类型

在DLA中建表时,需要采用正则表达式对CDN日志进行解析,每个字段和对应的正则表达式如下所示。

字段正则表达式
[9/Jun/2015:01:58:09 +0800](-|\\[[^\\]]*\\])
188.165.15.75([^ ]*)
-([^ ]*)
1542([^ ]*)
"-"([^ \"]*|\"[^\"]*\")
"GET http://www.aliyun.com/index.html"([^ \"]*|\"[^\"]*\")
200(-|[0-9]*)
191(-|[0-9]*)
2830(-|[0-9]*)
MISS([^ ]*)
"Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"([^ \"]*|\"[^\"]*\")
"text/html"([^ \"]*|\"[^\"]*\")

完整的正则表达式为:(-|\\[[^\\]]*\\]) ([^ ]*) ([^ ]*) ([^ ]*) ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*) (-|[0-9]*) ([^ ]*) ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\")

DLA中通过以下SQL创建日志文件表。

  1. CREATE EXTERNAL TABLE cdn_log (
  2. log_timestamp VARCHAR,
  3. access_ip VARCHAR,
  4. proxy_ip VARCHAR,
  5. response_time VARCHAR,
  6. referer VARCHAR,
  7. request VARCHAR,
  8. httpcode SMALLINT,
  9. request_size BIGINT,
  10. response_size BIGINT,
  11. cache_hit_status VARCHAR,
  12. ua_header VARCHAR,
  13. file_type VARCHAR
  14. )
  15. ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
  16. WITH SERDEPROPERTIES (
  17. "input.regex" = "(-|\\[[^\\]]*\\]) ([^ ]*) ([^ ]*) ([^ ]*) ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*) (-|[0-9]*) ([^ ]*) ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\")"
  18. )
  19. STORED AS TEXTFILE
  20. LOCATION 'oss://bucket-name/cdn/'
  21. TBLPROPERTIES ('recursive.directories' = 'true');

步骤四:查询、分析CDN日志

  1. SELECT * FROM cdn_log;
  2. +------------------------------+---------------+----------+---------------+---------+----------------------------------+----------+--------------+---------------+------------------+-------------------------------------------------------------+---------------------------+
  3. | log_timestamp | access_ip | proxy_ip | response_time | referer | request | httpcode | request_size | response_size | cache_hit_status | ua_header | file_type |
  4. +------------------------------+---------------+----------+---------------+---------+----------------------------------+----------+--------------+---------------+------------------+-------------------------------------------------------------+---------------------------+
  5. | [18/Jun/2019:05:08:33 +0800] | 47.92.115.203 | - | 777 | "-" | "GET http://www.kalabandha.com/" | 200 | 201 | 7159 | MISS | "Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D))" | "text/html;charset=UTF-8" |
  6. +------------------------------+---------------+----------+---------------+---------+----------------------------------+----------+--------------+---------------+------------------+-------------------------------------------------------------+---------------------------+

可以使用DLA系统函数,对数据进行分析。

  1. SELECT date_parse(substring(log_timestamp, 2, length(log_timestamp) - 8), '%d/%b/%Y:%H:%i:%s') as log_timestamp,
  2. access_ip,
  3. proxy_ip,
  4. response_time,
  5. substring(referer, 2, length(referer) - 2) as referer,
  6. substring(request, 2, length(request) - 2) as request,
  7. httpcode,
  8. request_size,
  9. response_size,
  10. cache_hit_status,
  11. substring(ua_header, 2, length(ua_header) - 2) as ua_header,
  12. substring(file_type, 2, length(file_type) - 2) as file_type
  13. FROM cdn_log;
  14. +-------------------------+---------------+----------+---------------+---------+--------------------------------+----------+--------------+---------------+------------------+-----------------------------------------------------------+-------------------------+
  15. | log_timestamp | access_ip | proxy_ip | response_time | referer | request | httpcode | request_size | response_size | cache_hit_status | ua_header | file_type |
  16. +-------------------------+---------------+----------+---------------+---------+--------------------------------+----------+--------------+---------------+------------------+-----------------------------------------------------------+-------------------------+
  17. | 2019-06-18 05:08:33.000 | 47.92.115.203 | - | 777 | - | GET http://www.kalabandha.com/ | 200 | 201 | 7159 | MISS | Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D)) | text/html;charset=UTF-8 |
  18. +-------------------------+---------------+----------+---------------+---------+--------------------------------+----------+--------------+---------------+------------------+-----------------------------------------------------------+-------------------------+