當您需要使用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