日志服务支持Logstore和RDS数据库进行联合查询,并把查询结果保存到RDS中。

前提条件

已采集到日志,详情请参见数据采集

背景信息

日志服务查询分析引擎,提供Logstore和RDS数据库联合查询分析功能,使用SQL的JOIN语法将日志和用户元信息关联起来。除此之外,还支持将计算结果直接写入RDS数据库中。本文以阿里云RDS MySQL数据库为例。

操作步骤

  1. 创建RDS MySQL实例并指定VPC环境,详情请参见创建RDS MySQL实例
  2. 设置白名单。
    设置RDS实例的白名单,以允许外部设备访问该RDS实例。设置RDS白名单为100.104.0.0/16、11.194.0.0/16或11.201.0.0/16,详情请参见设置白名单
  3. 创建RDS MySQL表,详情请参见CREATE TABLE Statement
  4. 创建ExternalStore。
    1. 安装日志服务CLI,详情请参见命令行工具CLI
    2. 创建配置文件/root/config.json并添加如下脚本。
      请根据实际值替换如下信息。
      {
      "externalStoreName":"storeName",
      "storeType":"rds-vpc",
      "parameter":
         {
         "region":"cn-qingdao",
         "vpc-id":"vpc-m5eq4irc1pucp*******"
         "instance-id":"i-m5eeo2whsn*******"
         "host":"localhost",
         "port":"3306",
         "username":"root",
         "password":"****",
         "db":"scmc"
         "table":"join_meta"
         }
      }
      参数 说明
      region RDS实例所在地域
      vpc-id VPC ID
      instance-id RDS实例ID
      host RDS域名
      port RDS端口
      username 数据库用户名
      password 数据库密码
      db 数据库
      table 数据表
    3. 创建ExternalStore。
      其中project_name为日志服务Project名称,请根据实际值替换。
      aliyunlog log create_external_store --project_name="log-rds-demo" --config="file:///root/config.json" 
  5. 使用JOIN语法进行联合查询。
    1. 登录日志服务控制台
    2. Project列表区域,单击目标Project。
    3. 日志管理 > 日志库页签中,单击目标Logstore。
    4. 执行查询分析语句。
      支持的JOIN语法有INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。
      [ INNER ] JOIN
      LEFT [ OUTER ] JOIN
      RIGHT [ OUTER ] JOIN
      FULL [ OUTER ] JOIN
      JOIN语法样例如下所示:
      method:postlogstorelogs | select count(1) , histogram(logstore) from log  l join join_meta m on l.projectid = cast( m.ikey as varchar)
      说明
      • 仅支持Logstore与RDS小表(数据量小于20 MB)进行联合查询。
      • 查询分析语句中,Logstore必须写在join关键字前面,ExternalStore写在join关键字后面。
      • 查询分析语句中,必须写ExternalStore名称,系统自动替换成RDS的数据库名+表名。请勿直接填写RDS表名。
  6. 保存查询结果到RDS MySQL中。
    日志服务支持通过Insert语法将查询结果插入到RDS MySQL中。Insert语法样例如下所示:
    method:postlogstorelogs | insert into method_output  select cast(methodasvarchar(65535)),count(1)fromloggroupbymethod

操作样例

Python程序样例
# encoding: utf-8
from __future__ import print_function
from aliyun.log import *
from aliyun.log.util import base64_encodestring
from random import randint
import time
import os
from datetime import datetime
    endpoint = os.environ.get('ALIYUN_LOG_SAMPLE_ENDPOINT', 'cn-chengdu.log.aliyuncs.com')
    accessKeyId = os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSID', '')
    accessKey = os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSKEY', '')
    logstore = os.environ.get('ALIYUN_LOG_SAMPLE_LOGSTORE', '')
    project = "ali-yunlei-chengdu"
    client = LogClient(endpoint, accessKeyId, accessKey, token)
    #创建ExternalStore
    res = client.create_external_store(project,ExternalStoreConfig("rds_store","region","rds-vpc","vpc id","实例id","实例ip","实例端口","用户名","密码","数据库","数据库表"));
    res.log_print()
    #获取ExternalStore详情
    res = client.get_external_store(project,"rds_store");
    res.log_print()
    res = client.list_external_store(project,"");
    res.log_print();
    # JOIN查询
    req = GetLogsRequest(project,logstore,From,To,"","select count(1) from  "+ logstore +"  s join  meta m on  s.projectid = cast(m.ikey as varchar)");
    res = client.get_logs(req)
    res.log_print();
     # 查询结果写入RDS
    req = GetLogsRequest(project,logstore,From,To,""," insert into rds_store select count(1) from  "+ logstore );
    res = client.get_logs(req)
    res.log_print();