当您需要使用SQL查询和分析日志服务中的数据时,可以通过JDBC、Python MySQLdb、MySQL命令行工具等方式连接日志服务来实现。本文主要为您介绍JDBC、Python MySQLdb、MySQL命令行工具连接日志服务的操作步骤。
使用限制
目前日志服务仅支持JDBC 5.1.49版本。
使用Java的JDBC、Python的MySQL Connector等库在程序中访问日志服务时,目前仅支持私网服务入口(阿里云经典网络和VPC网络的访问域名)。更多信息,请参见服务入口。否则会出现连接超时报错
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure,Caused by: java.net.ConnectException: Connection timed out: connect
。
前提条件
背景信息
MySQL是当前流行的关系型数据库,很多软件支持通过MySQL传输协议和SQL语法获取MySQL数据。因此,为了满足不同业务场景、不同系统查询和分析日志的需求,日志服务也可以被视为MySQL数据库来使用。您可以使用标准MySQL连接工具连接到日志服务,使用标准的SQL语法计算和分析日志。支持MySQL传输协议的客户端包括MySQL client,JDBC和MySQL Connector/Python。日志服务查询分析语句转换成SQL语句请参见查询和分析语法。
使用场景:
在可视化工具中(如DataV、Tableau或Grafana等)将日志服务作为数据源进行可视化分析。
在Java(或Python)程序中,需要查询、分析或使用日志服务中的数据时,可以通过Java的JDBC(或MySQL Connector/Python)等方式连接日志服务。
日志服务和MySQL数据库对比:
日志服务 | MySQL |
Project | 数据库(database) |
Logstore | 表(table) |
索引 | 表字段 |
日志服务使用SQL语句查询分析日志不支持分页。
通过JDBC访问日志服务
创建一个Maven项目,在POM依赖中添加JDBC依赖(目前日志服务仅支持JDBC 5.1.49版本),示例代码如下所示。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency>
您可以在任何一个支持MySQL connector的程序中使用MySQL语法连接日志服务。例如JDBC、Python MySQLdb,此处以JDBC为例:
重要在where条件中必须包含
__date__
字段或__time__
字段来限制查询的时间范围。__date__
字段是timestamp类型,__time__
字段是bigint类型。例如:__date__ > '2017-08-07 00:00:00' and __date__ < '2017-08-08 00:00:00'
__time__ > 1502691923 and __time__ < 1502692923
/** * Created by mayunlei on 2017/6/19. */ import com.mysql.jdbc.*; import java.sql.*; import java.sql.Connection; import java.sql.Statement; /** * Created by mayunlei on 2017/6/15. */ public class CollectTest { public static void main(String args[]){ // 包括Project名称和日志服务经典网络或VPC网络的访问域名,请根据实际情况替换。 final String endpoint = "trip-demo.cn-hangzhou-intranet.log.aliyuncs.com"; // 通过JDBC访问时,默认使用10005端口。 final String port = "10005"; // 日志服务Project名称。 final String project = "trip-demo"; // 日志服务Logstore名称。 final String logstore = "ebike"; // 本示例从环境变量中获取AccessKey ID和AccessKey Secret。 final String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); final String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); Connection conn = null; Statement stmt = null; try { // 步骤1 :加载JDBC驱动。 Class.forName("com.mysql.jdbc.Driver"); // 步骤2 :创建一个链接。 conn = DriverManager.getConnection("jdbc:mysql://"+endpoint+":"+port+"/"+project+"?useSSL=false",accessKeyId,accessKey); // 步骤3 :创建statement。 stmt = conn.createStatement(); // 步骤4 :定义查询语句,查询2017年10月11日全天日志中满足条件op = "unlock"的日志条数。 String sql = "select count(1) as pv from "+logstore+" " + "where __date__ >= '2017-10-11 00:00:00' " + " and __date__ < '2017-10-12 00:00:00'" + " and op ='unlock'"; // 步骤5 :执行查询条件。 ResultSet rs = stmt.executeQuery(sql); // 步骤6 :提取查询结果。 while(rs.next()){ // Retrieve by column name System.out.print("pv:"); // 获取结果中的pv。 System.out.print(rs.getLong("pv")); System.out.println(); } rs.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
参数
描述
是否必选
示例值
project
目标Project。
是
trip-demo
endpoint
阿里云私网。
是
cn-hangzhou-intranet.log.aliyuncs.com
port
端口号。
是
10005
accessId
标识用户。
是
LT*******************KX
accessKey
用户用于加密签名字符串和日志服务用来验证签名字符串的密钥。
是
aaw************************Qf
查询数据。
通过MySQL Connector/Python访问日志服务
在命令行工具中,以管理员身份执行如下安装命令安装mysql-connector-python。
pip install mysql-connector-python #python2 命令 pip3 install mysql-connector-python #python3 命令
创建
mysqlQuery.py
文件,按实际填写以下参数。重要在where条件中必须包含
__date__
字段或__time__
字段来限制查询的时间范围。__date__
字段是timestamp类型,__time__
字段是bigint类型。例如:__date__ > '2017-08-07 00:00:00' and __date__ < '2017-08-08 00:00:00'
__time__ > 1502691923 and __time__ < 1502692923
import mysql.connector import os def main(): # 用户名 user = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '') # 密码 password = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '') # endpoint host = 'cn-chengdu-intranet.log.aliyuncs.com' # 数据库名 project = 'aliyun-test-project' # 端口号 port = 10005 # 表名 logstore = 'logstore-test' print("collect database start ") # 连接数据库 cnx = mysql.connector.connect(host=host, user=user, password=password, database=database, port=port) print("collect database success ") # 创建一个游标对象 cursor = cnx.cursor() # 执行一个查询 query = "select count(1) as pv from " + logstore + " where __date__ >= '2024-05-27 00:00:00' and __date__ < '2024-05-31 00:00:00'" print("query data success") cursor.execute(query) print("query data success") # 获取查询结果 for (column1) in cursor: print("{}".format(column1)) # 关闭游标和连接 cursor.close() cnx.close() if __name__ == '__main__': main()
参数
描述
是否必选
示例值
project
目标Project。
是
trip-demo
logstore
目标logstore
是
logtore-test
endpoint
阿里云私网。
是
cn-hangzhou-intranet.log.aliyuncs.com
port
端口号,固定为10005。
是
10005
user
阿里云AccessKey ID。建议使用RAM用户的AccessKey。
是
LT*******************KX
password
阿里云AccessKey Secret。建议使用RAM用户的AccessKey。
是
aaw************************Qf
输入以下命令查询数据。
python mysqlQuery.py #python2 命令 python3 mysqlQuery.py #python3 命令
通过ECS服务器访问日志服务
连接日志服务。
mysql -h my-project.host -uuser -ppassword -P port
示例:
mysql -h my-project.cn-hangzhou-intranet.log.aliyuncs.com -ubq****mo86kq -p4f****uZP -P 10005
参数
说明
host
日志服务访问域名,必须添加Project名称,即格式为
Project名称.私网服务入口
。例如my-project.cn-hangzhou-intranet.log.aliyuncs.com。目前仅支持私网服务入口(阿里云经典网络和VPC网络的访问域名)。更多信息,请参见私网。
port
默认使用10005。
user
阿里云AccessKey ID。建议使用RAM用户的AccessKey。
password
阿里云AccessKey Secret。建议使用RAM用户的AccessKey。
my-project
日志服务Project名称。
重要一个数据库同时只支持连接一个Project。
进入当前项目。
use my-project;
查询数据。
重要在where条件中必须包含
__date__
字段或__time__
字段来限制查询的时间范围。__date__
字段是timestamp类型,__time__
字段是bigint类型。例如:__date__ > '2017-08-07 00:00:00' and __date__ < '2017-08-08 00:00:00'
__time__ > 1502691923 and __time__ < 1502692923
select count(1) as pv from my-logstore where __date__ >= '2024-05-27 00:00:00' and __date__ < '2024-05-31 00:00:00'
①、②处配置为您的Project。
③处配置为您的Logstore。
查询和分析语法
过滤语法
说明在where条件中必须包含__date__字段或__time__字段来限制查询的时间范围。__date__字段是timestamp类型,__time__字段是bigint类型。例如:
__date__ > '2017-08-07 00:00:00' and __date__ < '2017-08-08 00:00:00'
__time__ > 1502691923 and __time__ < 1502692923
where过滤语法说明如下表所示。
语义
示例
说明
字符串搜索
key = "value"
查询的是分词之后的结果。
字符串模糊搜索
key has 'valu*'
key like 'value_%'
查询的是分词之后模糊匹配的结果。
数值比较
num_field > 1
比较运算符包括>、>=、=、<和<=。
逻辑运算
and or not
例如a = "x" and b ="y"或a = "x" and not b ="y"。
全文搜索
__line__ ="abc"
如果使用全文索引搜索,需使用特殊的key(__line__)。
计算语法
支持计算操作符。更多信息,请参见分析语法。
SQL92语法
过滤语法和计算语法组合成为SQL92语法。
status>200 |select avg(latency),max(latency) ,count(1) as c GROUP BY method ORDER BY c DESC LIMIT 20
您可以将上述查询和分析语句中的分析语句与时间条件组合成为查询条件,变成标准SQL92语法,如下所示:
select avg(latency),max(latency) ,count(1) as c from sample-logstore where status>200 and __time__>=1500975424 and __time__ < 1501035044 GROUP BY method ORDER BY c DESC LIMIT 20