基于阿里日志分析实现Nginx log 日志看板

背景

公司有些项目组基于阿里的日志服务做了一些数据分析功能,我们项目组因为有了神策做业务方面的分析,技术日志方面的分析就引进机会不大了,毕竟业务型的公司比较注重成本。但是自己爱瞎倒腾,基于阿里的日志分析在博客后台嵌入了一个日志看板。同时也希望以后有机会能接触到这样的业务场景。

知识点

  • nginx log format
  • 阿里 sts认证

阿里后台配置

创建Project

首先需要创建一个Project服务,注意如果是非阿里云服务器这边的所属地区很重要!!

Project注册

创建Logstore

创建Logstore

配置Nginx日志导入

日志导入一

日志导入二

日志导入三

这边的日志路径大家可以配置一个自己常用的,模式选择json。这里解释下为什么要用json作为log_format的输出,因为阿里后台的正则匹配有时候会有点问题,个人感觉json键值对的方式是最为准确的配置方法。

服务器

Logtail安装

Logtail接入服务是日志服务提供的日志采集Agent,通过控制台方式帮助您实时采集阿里云ECS、自建IDC、其他云厂商等服务器上的日志。 市面上见到的大多数分布式日志收集都是采取这样的日志收集手段,优点是代码入侵性小,内网集群日志传输快(这个教程笔记采用的外网,别问为什么,因为穷!)

Project服务日志服务Project 的所在的区域必须在一块,这里踩过坑!

1
2
3
4
wget http://logtail-release-cn-qingdao.oss-cn-qingdao.aliyuncs.com/linux64/logtail.sh -O logtail.sh; chmod 755 logtail.sh; ./logtail.sh install cn-qingdao-internet

touch /etc/ilogtail/users/阿里账号ID #非阿里服务器需要进行这一步操作

创建机器组

创建机器组

IP这里输入 cat /usr/local/ilogtail/app_info.json 获取到的信息

检测心跳

心跳检测1
心跳检测2

PS:服务器配置这里记录的几个步骤都比较简陋,详细的可以参考阿里云的官方文档。比如各个大区的域名什么的

nginx配置log_format

log_format 用一句话简单概括一下,就是Nginx access_log 日志的约定日志格式,相应的语法等知识点这里就不展开说明了。在http{}内加入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" $http_host '
'$status $request_length $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time $upstream_response_time';

log_format log_json '{ "@timestamp": "$time_local", '
'"remote_addr": "$remote_addr", '
'"referer": "$http_referer", '
'"request": "$request", '
'"status": $status, '
'"bytes": $body_bytes_sent, '
'"agent": "$http_user_agent", '
'"x_forwarded": "$http_x_forwarded_for", '
'"up_addr": "$upstream_addr",'
'"up_host": "$upstream_http_host",'
'"up_resp_time": "$upstream_response_time",'
'"request_time": "$request_time"'
' }';

这里 main是log_format默认格式,log_json是我们自定义的一个json输出。给access_log加上josn格式的日志输出

1
access_log  /home/wwwlogs/blog_access.log log_json;

验证日志采集

在cat或者tail -f /home/wwwlogs/blog_access.log 确定日志格式为json后可以进到Logtail管理页面进行如下操作,查看日志是否正常写入

 验证日志采集一
验证日志采集二

PHP

sts后台授权登陆

加载SDK

composer require anchnet/aliyun-openapi-php-sdk:dev-master

Service方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
/**
* 阿里巴巴那一系列的认证都在这了
* Created by PhpStorm.
* User: zhangjunjie
* Date: 2018/10/11
* Time: 12:17 PM
*/

namespace App\Services;
use Sts\Request\V20150401 as Sts;

class AliyunService
{

/**
* 日志分析入口
*/
public function logUrl()
{
define("REGION_ID", "cn-qingdao");
define("ENDPOINT", "sts.cn-qingdao.aliyuncs.com");

// 只允许子用户使用角色
\DefaultProfile::addEndpoint(REGION_ID, REGION_ID, "Sts", ENDPOINT);
$iClientProfile = \DefaultProfile::getProfile(REGION_ID, "看手册获取", "看手册获取");
$client = new \DefaultAcsClient($iClientProfile);

// 如何设置sts访问日志服务请参考文档:https://www.atatech.org/articles/101998
$roleArn = "看手册获取";
$roleArnSession = "slsconsole-session";
$request = new Sts\AssumeRoleRequest();
$request->setRoleSessionName($roleArnSession);
$request->setRoleArn($roleArn);

try {
$response = $client->getAcsResponse($request);

// construct get token url
$signInHost = "https://signin.aliyun.com";
$signInTokenUrl = $signInHost . "/federation?Action=GetSigninToken"
. "&AccessKeyId=" . urlencode($response->Credentials->AccessKeyId)
. "&AccessKeySecret=" . urlencode($response->Credentials->AccessKeySecret)
. "&SecurityToken=" . urlencode($response->Credentials->SecurityToken)
. "&TicketType=mini";

// request signin
$curlInit = curl_init();
curl_setopt($curlInit, CURLOPT_URL, $signInTokenUrl);
curl_setopt($curlInit, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curlInit);
curl_close($curlInit);

$signInTokenJson = json_decode($result);
$signInToken = $signInTokenJson->SigninToken;

//https://help.aliyun.com/document_detail/74971.html?spm=5176.11777732.1158279.48.12717a34tthVC4
// construct final url
$signInUrl = $signInHost . "/federation?Action=Login"
. "&LoginUrl=" . urlencode("https://www.aliyun.com")
. "&Destination=" . urlencode("https://sls4service.console.aliyun.com/next/project/bloge/dashboard/dashboard-1541083754581-162803?isShare=true&hideTopbar=true&hideSidebar=true
")
. "&SigninToken=" . urlencode($signInToken);
return $signInUrl;

} catch (ServerException $e) {
print "Error: " . $e->getErrorCode() . " Message: " . $e->getMessage() . "\n";
} catch (ClientException $e) {
print "Error: " . $e->getErrorCode() . " Message: " . $e->getMessage() . "\n";
}
}
}

后记

这里只是记录下了此博客后台放这个看板功能的步骤,一些细节的操作还是要依官方文档为准的,但是这里踩过的坑或许能帮到你!有时间和精力也可以研究下ELK烧钱一条龙~晚安。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~