全部产品
Search
文档中心

日志服务:Logstore和MySQL联合查询分析

更新时间:Jun 24, 2024

日志服务支持通过Join语法将Logstore和MySQL数据库进行联合查询,并把查询结果保存到MySQL数据库中。

前提条件

已创建ExternalStore。具体操作,请参见关联MySQL数据源

操作步骤

  1. 登录日志服务控制台

  2. 在Project列表区域,单击目标Project。

    image

  3. 在控制台左侧,单击日志存储,在日志库列表中单击目标Logstore。

    image

  4. 执行查询分析语句。

    支持的Join语法有INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。

    [ INNER ] JOIN
    LEFT [ OUTER ] JOIN
    RIGHT [ OUTER ] JOIN
    FULL [ OUTER ] JOIN

    JOIN语法样例如下所示。更多信息,请参见关联Logstore与MySQL数据库进行查询分析

    method:postlogstorelogs | select count(1) , histogram(logstore) from log  l join join_meta m on l.projectid = cast( m.ikey as varchar)
    重要
    • 仅支持Logstore与MySQL数据库小表(数据量小于20 MB)进行联合查询。

    • 查询和分析语句中,Logstore必须写在join关键字前面,ExternalStore写在join关键字后面。

    • 查询和分析语句中,必须写ExternalStore名称,系统自动替换成MySQL数据库名+表名。请勿直接填写MySQL表名。

  5. 保存查询结果到MySQL数据库中。

    说明

    MySQL数据库表的字段是varchar,需要将日志库的字段转换为MySQL表的字段。例如MySQL表的字段detailvarchar(60),在Logstore中将索引content用cast函数转换:cast(content as varchar(60))。cast函数请参见cast函数

    日志服务支持通过Insert语法将查询结果插入到MySQL数据库中。Insert语法样例如下所示:

    method:postlogstorelogs | insert into method_output  select cast(method as varchar(65535)),count(1) from log group by method

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, '')
    #创建ExternalStore。
    res = client.create_external_store(project,
                                       ExternalStoreConfig(externalStoreName="rds_store", region="cn-chengdu",
                                                           storeType="rds-vpc",
                                                           vpcId="vpc-2vctx8reuqswmk********",
                                                           instanceId="",
                                                           host='rm-2vc6x67972iv********.mysql.cn-chengdu.rds.aliyuncs.com',
                                                           port="3306", username="root", password="Gs516945070",
                                                           database="gstest", table="test"))
    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()
     # 将查询和分析结果写入MySQL数据库。
    req = GetLogsRequest(project,logstore,From,To,"","* |  insert into rds_store select count(1) from  "+ logstore )
    res = client.get_logs(req)
    res.log_print()

ExternalStoreConfig方法参数说明:

参数

说明

externalStoreName

ExternalStore名称,必须小写。

storeType

数据源类型,固定为rds-vpc。

region

地域。详细说明如下:

  • 如果是RDS MySQL数据库,则配置region为RDS实例所在地域。

  • 如果是专有网络下ECS上自建的MySQL数据库,则配置region为ECS实例所在地域。

重要

RDS实例或ECS实例必须与日志服务Project处于同一地域。

vpc-id

VPC ID。详细说明如下:

  • 如果是专有网络下的RDS MySQL数据库,则配置vpc-id为RDS实例所属专有网络的ID。

  • 如果是专有网络下的ADB MySQL数据库,则配置vpc-id为ADB实例所属专有网络的ID。

  • 如果是专有网络下ECS上自建的MySQL数据库,则配置vpc-id为ECS实例所属专有网络的ID。

  • 如果数据库host可以通过公网访问,则vpc-id无需提供

host

数据库地址。详细说明如下:

  • 如果是专有网络下的RDS MySQL数据库,则配置host为RDS实例的内网地址(内网域名或内网IP地址)。

  • 如果是专有网络下的ADB MySQL数据库,则配置host为ADB实例的内网地址(内网域名或内网IP地址)。

  • 如果是专有网络下ECS上自建的MySQL数据库,则配置host为ECS的私网IP地址。

  • 如果数据库通过公网可以访问,则配置对应的公网域名或公网IP地址。

instanceId

数据库实例id。固定为''

port

端口号。详细说明如下:

  • 如果是RDS MySQL数据库,则配置port为RDS实例的端口号。

  • 如果是专有网络下ECS上自建的MySQL数据库,则配置port为ECS上MySQL的服务端口。

username

数据库用户名。

password

数据库密码。

database

数据库。

table

数据库表。