日志服务支持通过Join语法将Logstore和MySQL数据库进行联合查询,并把查询结果保存到MySQL数据库中。
前提条件
已创建ExternalStore。具体操作,请参见关联MySQL数据源。
操作步骤
登录日志服务控制台。
在Project列表区域,单击目标Project。
在控制台左侧,单击日志存储,在日志库列表中单击目标Logstore。
执行查询分析语句。
支持的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表名。
保存查询结果到MySQL数据库中。
说明MySQL数据库表的字段是varchar,需要将日志库的字段转换为MySQL表的字段。例如MySQL表的字段
detail
为varchar(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实例或ECS实例必须与日志服务Project处于同一地域。 |
vpc-id | VPC ID。详细说明如下:
|
host | 数据库地址。详细说明如下:
|
instanceId | 数据库实例id。固定为 |
port | 端口号。详细说明如下:
|
username | 数据库用户名。 |
password | 数据库密码。 |
database | 数据库。 |
table | 数据库表。 |