开发者社区> 问答> 正文

【阿里云产品公测】简单日志服务SLS使用评测含教程

mr_wid 2014-10-09 07:18:30 36384



评测介绍

  • 被测产品: 简单日志服务SLS
  • 评测环境: 阿里云基础ECS x2(1核, 512M, 1M)
  • 操作系统: CentOS 6.5 x64
  • 日志环境: Nginx(v1.6.2) HTTP服务器访问日志
  • 评测人: mr_wid
  • 评测时间: 2014年9月29日-2014年10月8日


              

准备工作


一、知彼知己, 百战不殆。对产品的了解程度, 直接决定着评测质量, 在评测前, 笔者首先整理并详细阅读了有关SLS产品以及关联产品的官方相关文档:
二、Nginx HTTP服务器准备:
在真实的HTTP服务器应用场景中, 为了降低磁盘I/O、单一宽带下的访问瓶颈限制,通常会将图片、静态文件与用户访问的主服务器进行服务器分离, 从而提高网站响应速度与负载能力。 在本次的评测中, 使用了两台基础 ECS服务器, 将其中一台作为图片服务器, 另一台作为用户访问的主服务器进行测试。 这两台服务器的环境配置如下:
  • 主服务器: CentOS + Nginx + MySQL + PHP
  • 图片服务器: CentOS + Nginx


              

SLS使用起步


一、创建Access Key


在 SLS 服务中, 由于 SLS 客户端 Logtail 与 SLS 的SDK 均需要Access Key的支持, 所以需要保证云服务器所在账号下至少存在一个启用状态的AccessKey, 创建Access Key的过程: 登录阿里云官网(http://www.aliyun.com/), 进入"用户中心" -> "我的服务" 页面, 在左侧栏 "安全认证"(https://i.aliyun.com/access_key/) 页面即可创建本账号下的Access Key, 如图:
[attachment=61963]
其中, Access Key ID 与 Access Key Secret 即组成一对Access Key。



二、创建SLS项目

在SLS控制面板, 选择 "创建Project" 并输入项目名称, 如图所示创建一个名为 "sls-test-project" 的SLS项目。
[attachment=61964]
创建完成后如图:
[attachment=61965]


三、创建SLS项目日志分类


SLS日志类型(Category), 即对所要监测的日志进行分类, 分类规则应至少遵循同一分类下的日志具有相同的日志格式这一规则。 以 Nginx 的 Access Log 日志为例, 创建名为 "nginx-access-log" 的SLS日志类型。进入上一步创建的 "sls-test-project" SLS项目管理页, 选择 "创建Category", 如图:
[attachment=61966]
在日志数据消费模式选项, 为了更全面的评测SLS, 我们将离线归档到ODPS选项也勾选上。点击 "确定", 创建完成后将会提示是通过 Logtail 客户端收集日志还是通过SLS的SDK API, 这里我们选择 "创建 Logtail 配置"。Logtail 是一个运行在 UNIX/Linux 上的日志收集程序, SDK提供的API可以通过SLS提供的API对日志进行写入、查询等操作。进入  Logtail 配置页面:

[attachment=61967]
在指定日志目录结构这一步, 根据服务器的配置填入nginx的日志路径, 由于nginx自身并不会对日志文件进行分割, 所以这里仅监控access.log 文件。对于自动分割型日志, 可用通配符进行监控, 如日志被分割为access.log、access-1.log、access-2.log、..., 使用通配符  access*.log

在日志样例项, 可以从已有的日志文件中随机抽取一条或多条日志, 进入下一步。
[attachment=61968]
在解析日志这一步, 需要用到正则表达式来对日志进行结构划分, 在这之前, 首先来看一下Nginx的详细日志结构, 在 nginx.conf 里可以通过自己的需求对日志样式进行自定义, 这里的配置如下:
log_format main $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent";
对应着示例中的日志, 对这条配置文件进行下解释:

日志字段与样例日志中对应部分字段解释
$remote_addr113.64.66.49客户端的ip地址
--仅作分隔符
$remote_user-客户端用户名称
[$time_local][17/Aug/2014:15:24:13 +0800]访问请求时间
$request"GET /article/centos-64bit-nginx-php-fastcgi-opcache-mariadb HTTP/1.1"请求方式、URI与所用http协议
$status200请求响应状态
$body_bytes_sent35177响应主体大小
$http_referer"http://www.x86pro.com/"请求来源页面地址
$http_user_agent"Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Firefox/24.0"用户客户端相关信息

匹配日志各字段的正则表达式规则如下:
^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s-\s(.*)\s\[(.*)\]\s\"(.*)\"\s(\d{3,})\s(\d+)\s\"([^\s]*)\"\s\"(.*)\"$

关于正则表达式, 这里需要一些正则的基础, 对正则不是很熟悉的同学, 建议参考相关的文章对正则表达式有个大致的理解, 推荐文章《正则表达式30分钟入门教程》, 这里仅解释一下与这条正则有关的部分:

^匹配字符串的开始
$匹配字符串的结束
()将括号内的部分作为一个整体
\转义符
\d匹配一个数字
{m,n}重复匹配 m 到 n 次, 例 \d{1,3} : 匹配长度为 1-3 的数字
\s匹配任意空白符, 如普通空格、\t、\n、\r
.匹配除换行符以外的任意字符
+重复一次或更多次

根据笔者的测试, 对日志进行划词 "自动生成" 正则表达式的结果, 并不理想, 所以自动生成的结果仅供参考, 请勿直接以生成的正则表达式作为正式结果。

在 时间格式转换项, 由于软件写入的日志时间格式可能不同, 所以需要按照一定的规则, 把时间格式手动转换成SLS能够认识的格式, 详细转换方式以及转换选项参见 简单日志服务 › 常见问题 › 时间格式转换文档。
接下来的两步, 按照提示创建机器组, 然后应用到机器组就可以了, 这里不再赘述, 过程如图所示:

[attachment=61969]
[attachment=61970]

约1分钟后,日志数据开始显示:
[attachment=61971]

              


SLS日志查询

在如图所示的搜索栏中, 即可执行SLS查询语句, 示例语句: 查询15分钟内所有响应状态为 404 的请求:
[attachment=61972]
从示例的查询结果中 request 字段可以看到, 内网IP为10.168.68.10的网站根目录下缺少 robots.txt文件,10.168.63.86图片服务器缺失 /images/productimages/frontcol.jpg 文件, 从而产生了404,针对这些有问题的404的页面, 我们就可以及时对其进行改进。如果再结合SLS提供的逻辑查询语法, 对日志的常规分析可谓是变得十分轻松便捷。  

对查询语句的说明: 在 "status 404" 查询语句中, 表示要被查询的日志项中, 既有 'status'关键字, 也有 '404' 关键字, 这是按关键字匹配, 并且被搜索的关键字不区分大小写, 并不是指 'status' 的值为 '404'的日志, 这一点十分重要, 不要误解。

那么在 "status 404", 的搜索结果中, 是否全部都是 status 为 404 的结果呢? 答案是否定的, 例如在某日志中status 为200, 但 body_bytes_sent 为 404, 那么该日志同样会被检索显示出来。 如图:
[attachment=62072]
这并不是bug, 而是笔者最初时的理解有误, 认为 status 404 就会在所有日志的 status 字段中查找(实际上在这里加或不加status 关键字对结果并无影响, 笔者仅为了说明这个问题), 针对这点, 笔者也会在评测的最后提出相关的建议, 建议增加相关的查询规则,这里暂且按下不表。

SLS日志查询语句语法目前保留的关键字有andornot(不区分大小写) 以及 小括号()、双引号 " 与反斜杠 \ , 并且这些关键词具有优先级之分,  优先级的顺序为 " > ( ) > and not > or, (and 与 not 为同级), 优先级的高低决定着关键字之间查询的结合方向。这类似于加减乘除四则运算中, 当加减同时出现在一个式子中时先算乘除法, 再算加减法, 若有括号, 先算括号里面的,对于这些查询关键词的用法, 可以用一些应用示例来说明:


查询状态为404的页面, 并且被请求资源为 robots.txt 的日志: 404 and robots.txt

查询用户浏览器类型为火狐或Chrome的日志: Firefox or Chrome

查询请求响应状态码除 200 和 304 外的日志: not 200 not 304

双引号 " 的用法: 用一对双引号括起来的内容表示一个字符串, 任何在字符串内的内容, 都将被当做一个整体, 并且双引号内的保留关键字不再具备逻辑查询能力, 可用来转义关键字, 如:
查询日志中含有 and 字符的日志: "and"

转义符 \ 的用法:  \ 用来转义关键字中的双引号 ", 单单一个 " 则为SLS查询语法中的关键字, 但加上 \" 进行转义后, 便表示双引号自身, 示例用法:
查询日志中带 双引号 的日志: \"


日志的关键字在哪

在上面多次提到SLS是按关键字进行查询的, 并且这个关键字由SLS自动划分,目前无法手动干预, 那么如何才能知道自己搜索的是不是关键字就成了搜索时所遇到的问题, 根据笔者的测试, 在日志结果中, 将鼠标移动到搜索结果上,能显示为手型的部分, 即为一个独立的关键字, 如图:
[attachment=62073]

只有了解了这点, 才能更好的使用查询, 举例来说, 当我们想搜索来源于 Google的请求, 假设Google的蜘蛛都来自 http://www.google.com/, 那么我们搜索 google 或 google.com是不能正确的显示出预期的结果的, 因为  google 和 google.com 并没有被SLS划分为关键字, www.google.com才是正确的关键字。

通过观察, 可以看到在日志中由空格、逗号、分号、斜杠等分隔符隔开的部分会被划分为关键词, 而小数点, 冒号、加号不会。




关于 Topic

在查询输入框左侧, 还有一个 "请输入 Topic, 没有请留空" 输入框, 从官方文档中可以看到, "Topic字段,是用户自定义字段,用以区分同一Category下的日志(例如:对一批访问日志根据不同的站点进行区分;或者将该字段留空不进行区分),默认该字段为空(不区分)",

根据文档的说明, 笔者在最初尝试使用该字段时, 就遇到了问题, 出问题的原因, 是认为 topic 字段应该像 time 字段那样,指定一个名的 topic 的列就可以了, SLS能自动识别, 但是实际情况是这样并不起作用, 在搜索栏依旧无法正确使用 topic进行日志的区分, 在经过各种尝试后, 感觉已经无法独立解决该疑问, 便决定提交工单。

阿里云的工单一向是十分有效率的, 提交不到5分钟,就确认原因了, 原因就是, 通过 Logtail 方式接入的日志, 是无法手动指定 Topic 的, 该字段在 Logtail 方式下为空, 只有通过 SDK 接入方式时, 才可以指定 Topic。

              


日志离线归档到ODPS

在配置 SLS日志数据消费模式时, 当勾选了离线归档到ODPS, 日志数据就会自动归档到ODPS的 sls_log_archive 项目中, 然后我们可方便的对日志数据进行下载、备份、数据分析等操作。

由于该项目是系统项目, 并不会显示在ODPS的控制面板项目列表中, 需要通过 ODPS 客户端ODPS 上传下载客户端 进行操作, ODPS客户端目前提供的是JAVA版本, 需要JAVA的JRE环境支持, 所以如果没有安装JRE环境的, 需要先安装JRE运行环境才能使用,官方文档中推荐 JRE 1.6(http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html#jre-6u45-oth-JPR)。

除客户端外, ODPS同样也支持通过JAVA SDK API进行编程化操作。ODPS Java SDK开发包

完整的 ODPS 参考文档见 ODPS用户手册


配置ODPS客户端

将下载的OSPD客户端 odps-cli-java.zip 解压后, 进入 conf 目录, 编辑配置文件 odps.conf,填入一组创建Access Key中生成的 Access Key ID 与 Access Key
access.id=你的 Access Key ID
access.key=你的 Access Key Secret
endpoint=http://service.odps.aliyun.com/api
default.project=sls_log_archive

配置完成后, 进入ODPS的bin目录, Windows系统执行 odps.bat, Linux执行odps, 以Windows环境为例, 直接双击 odps.bat 即可 进入ODPS命令行操作界面:

[attachment=62081]



配置ODPS上传下载客户端

将下载的 odps-dship.zip 解压, 笔者的解压路径为 D:\SlsEnv\odps-dship, 进入odps-dship目录, 编辑 odps.conf

#Odps dship config
#Wed Oct 08 13:39:54 CST 2014
tunnel-endpoint=http://dt.odps.aliyun.com (杭州节点内网对内网可用 http://dt-ext.odps.aliyun-inc.com)
key=你的 Access Key Secret
project=sls_log_archive (默认项目)
id=你的 Access Key ID
tunnel-endpoint配置说明参见: ODPS数据上传下载相关问题 > 使用ODPS tunnel或者dship下载数据时,如何设置endpoint更合理?

打开命令提示符, 切换到 odps-dship 目录下, 执行 Windows 执行dship.bat, Linux执行dship, 如图:

[attachment=62079]


查看 sls_log_archive 项目中指定表的信息

以创建的示例日志分组 nginx-access-log 为例, 该分组在ODPS中的表名称为 sls_test_project_nginx_access_log (Project名+Category名), 在ODPS命令行中, 命令:

desc sls_test_project_nginx_access_log
查询结果:
[attachment=62080]


表中各字段的介绍
序号列名类型备注
1__source__string日志来源IP,SLS保留字段
2__time__bigint日志产生的UNIX时间戳,SLS保留字段
3__topic__string日志topic,SLS保留字段
4_extract_others_stringJson字符串,半结构化的用户日志以key:value形式保存到该列
5__partition_time__string(pt)可读的日期格式,分区列,由__time__计算得到,例如2014_06_24_12_00


这里有一点需要注意的是, 表中的 __partition_time__ 字段, 这是一个"分区"字段,可以类似理解为一个独立的文件夹, 并且命名方式是以 2014_10_08_12_00 的形式, 以小时为单位递增,稍后在使用上传下载工具下载日志数据时, 将会用到该字段。



按 __partition_time__ 分区下载日志数据

odps的上传下载工具, 目前只支持下载到单个文件, 并且每一次下载只支持下载一个表或一个分区到一个文件,有分区的表必须要指定下载的分区才能正常下载。示例, 下载2014年10月7日20时的SLS nginx_access_log分类中的日志数据并命名为 access_log_1410072000.txt, 命令如下:

dship download sls_log_archive.sls_test_project_nginx_access_log/__partition_time__="2014_10_07_20_00" access_log_1410072000.txt
执行结果:
[attachment=62077]


这样, 就把 2014年10月7日20时-21时时间段内的所有日志下载到了当前目录下的 access_log_1410072000.txt文件中。为了提高下载效率以及完成批量下载等操作, 建议使用ODPS的SDK进行编程化下载, 或者编写可执行脚本, 如bat、Python等,用脚本调用ODPS的命令来实现。


限于评测主题, 以及篇幅长度问题, 关于 ODPS 的更多操作, 请参见 ODPS用户手册 , 这里不再一一介绍。


              


关于SLS SDK


评测已接近尾声, 对于SDK的使用, 需要一定的JAVA基础, 可参考SDK目录 /java/SlsSample.java 示例代码, 以及 apidoc 的文档。
对于新手来说, 一个常见的问题就是, 直接使用命令行编译示例代码 javac SlsSample.java 能够编译出 class 文件,但是运行时提示各种错误, 这是因为下载到的 SLS SDK 并不是完整的, 缺少的库可在 maven 库中找到, 请使用 maven 构建项目。


              


评测总结

针对此次使用过程中的一些心得体会, 现对SLS服务评测总结如下:

SLS 服务大大降低了对日志检索、查询、分析的复杂度, 使随时监控服务器的运行状态、健康状态成为可能。笔者有信心, SLS服务, 必将成为每台云服务器中不可或缺的服务之一, 同时, 也根据本次评测, 对SLS服务提出以下建议:

功能改进:
        1>. 扩展查询语法, 允许通过指定的字段进行查询, 如 status=404, 查询 status 字段 为 404 的日志;

        2>. 允许 Logtail 接入时指定某字段为 topic 字段;

        3>. 添加自定义日志警告提醒, 当日志中某字段出现某关键字时, 对邮箱/站内信发出提醒, 避免遗漏重大异常日志, 如: status 字段出现 503 日志时, 发送警告通知, 更进一步可以自定义警告等级;

        4>. 拓宽SLS服务与ODPS服务之间的数据通道, 允许用户直接按字段直接将日志归档到ODPS用户表中。

用户体验:
        1>. 继续完善产品文档, 添加对产品使用细节的描述;

        2>. 扩展SDK的适用范围, 支持更多编程语言;

        3>. 在日志查询结果页面下, 建议排序方式由时间降序排列, 将最新的日志显示在最前面;






如果感觉该评测对您有所帮助, 欢迎投票给本文:

投票标题: 【阿里云产品公测】简单日志服务SLS使用评测含教程;作者:mr_wid

投票地址: http://bbs.aliyun.com/read/178799.html?spm=5176.7189909.0.0.Xi4Fcj




分布式计算 监控 Java BI 应用服务中间件 Linux API MaxCompute 开发工具 nginx
分享到
取消 提交回答
全部回答(20)
  • 移动推送
    2015-12-22 17:22:34
    学习~
    0 0
  • kana
    2015-07-30 08:55:49
    Re【阿里云产品公测】简单日志服务SLS使用评测含教程
    SLS支持error log分析吗?
    0 0
  • 咸鱼930
    2015-06-27 18:01:09
    Re【阿里云产品公测】简单日志服务SLS使用评测含教程
    请问什么时候可以申请使用
    0 0
  • 河南seo
    2015-05-08 09:28:52
    Re【阿里云产品公测】简单日志服务SLS使用评测含教程
    欢迎大家访问我的个人网站!http://www.lichuangcheng.com
    0 0
  • swire
    2015-04-10 23:25:15
    Re【阿里云产品公测】简单日志服务SLS使用评测含教程
    先mark,留用。
    0 0
滑动查看更多

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题