SQL文を使用してSimple Log Serviceのログを照会および分析するには、Java Database Connectivity (JDBC) 、Python MySQLdb、およびMySQLコマンドラインツールを使用してSimple Log Serviceに接続します。 このトピックでは、JDBC、Python MySQLdb、およびMySQLコマンドラインツールを使用してSimple Log Serviceに接続する方法について説明します。
制限事項
Simple Log ServiceはJDBC 5.1.49のみをサポートします。
JavaのJDBCやPythonのMySQL Connectorなどのドライバーを使用してSimple Log Serviceにアクセスする場合は、Simple Log Serviceの内部エンドポイントのみを使用する必要があります。 内部エンドポイントには、クラシックネットワークまたはAlibaba cloudの仮想プライベートクラウド (VPC) を介してアクセスできます。 詳細については、「エンドポイント」をご参照ください。 別のエンドポイントを使用すると、次のエラーが発生します。
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure,Caused by java.net.ConnectException: Connection timed out: connect
。
前提条件
Alibaba CloudアカウントまたはRAM (Resource Access Management) ユーザー用にAccessKeyペアが作成されます。 詳細は、「AccessKeyペア」をご参照ください。
RAMユーザーのAccessKeyペアを使用する場合は、RAMユーザーがプロジェクトのAlibaba Cloudアカウントに属し、RAMユーザーにプロジェクトの読み取り権限が付与されていることを確認します。 詳細については、「権限アシスタント機能の設定」をご参照ください。
データはソースLogstoreに収集されます。 詳細については、「データ収集の概要」をご参照ください。
背景情報
MySQLは一般的なリレーショナルデータベースサービスです。 多数のソフトウェア製品は、MySQLプロトコルとSQL構文を使用してMySQLデータを取得できます。 さまざまなビジネスシナリオとシステムでログクエリと分析の要件を満たすために、Simple log ServiceをMySQLデータベースとして使用できます。 標準のMySQL接続ツールを使用してSimple Log Serviceに接続し、標準のSQL構文を使用してログを照会および分析できます。 MySQLクライアント、JDBC、およびMySQL Connector/Pythonは、MySQLプロトコルをサポートしています。 Simple Log ServiceクエリステートメントをSQLステートメントに変換する方法については、「検索と分析の構文」をご参照ください。
シナリオ
データソースとしてSimple Log Serviceを使用して、DataV、Tableau、Grafanaなどの視覚化ツールで視覚的な分析を実行します。
JDBCまたはMySQL Connector/Pythonを使用してSimple Log Serviceに接続し、JavaまたはPythonプログラムのSimple Log Serviceのデータを照会、分析、または使用します。
次の表は、Simple Log ServiceとMySQLのデータベースを比較しています。
シンプルなLog Service | MySQL |
Project | Database |
Logstore | Table |
Index | Table field |
SQL文を使用してSimple Log Serviceでログを照会および分析する場合、ページングはサポートされません。
JDBCを使用したSimple Log Serviceへの接続
Mavenプロジェクトを作成し、次のJDBC依存関係をプロジェクトのpom.xmlファイルに追加します。 サンプルコード:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency>
MySQLコネクタをサポートするプログラムを使用して、JDBCやPython MySQLdbなどのSimple Log Serviceに接続します。 次に、MySQL構文を使用してSimple Log Serviceのデータを照会します。 この例では、JDBCが使用されます。
重要クエリの時間範囲を制限するには、WHERE句に
__date__
または__time__
フィールドを含める必要があります。__date__
フィールドのデータ型はtimestampです。__time__
フィールドのデータ型はbigintです。 例:__date__ > '2017-08-07 00:00:00 'および__date__ < '2017-08-08 00:00:00'
__time__ > 1502691923および__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[]){ // The project name and an internal endpoint of Simple Log Service. Replace the name and endpoint with actual values. final String endpoint = "trip-demo.cn-hangzhou-intranet.log.aliyuncs.com"; // The port that is used for JDBC-based access. The default port is 10005. final String port = "10005"; // The name of the Simple Log Service project. final String project = "trip-demo"; // The name of the Simple Log Service Logstore. final String logstore = "ebike"; // In this example, the AccessKey ID and AccessKey secret are obtained from environment variables. 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 { // Step 1: Load the JDBC driver. Class.forName("com.mysql.jdbc.Driver"); // Step 2: Create a connection string. conn = DriverManager.getConnection("jdbc:mysql://"+endpoint+":"+port+"/"+project+"?useSSL=false",accessKeyId,accessKey); // Step 3: Create a statement. stmt = conn.createStatement(); // Step 4: Specify a query statement to query the number of logs that were generated on October 11, 2017 and whose op field is set to 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'"; // Step 5: Execute the query statement. ResultSet rs = stmt.executeQuery(sql); // Step 6: Extract the query and analysis results. while(rs.next()){ // Retrieve by column name System.out.print("pv:"); // Display pv in the results. 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
ターゲットプロジェクト名。
あり
trip-デモ
endpoint
Simple Log Serviceの内部エンドポイント。
あり
cn-hangzhou-intranet.log.aliyuncs.com
port
JDBCベースのアクセスに使用されるポート。
あり
10005
accessId
ユーザーを識別するために使用されるAccessKey ID。
あり
LT ******************* KX
accessKey
署名文字列の暗号化と検証に使用されるAccessKeyシークレット。
あり
-
データの照会
MySQL Connector/Pythonを使用したSimple Log Serviceへの接続
コマンドラインツールで、管理者として次のいずれかのコマンドを実行して、mysql-connector-pythonをインストールします。
pip install mysql-connector-python # Command for Python 2. pip3 install mysql-connector-python # Command for Python 3.
mysqlQuery.py
ファイルを作成し、ビジネス要件に基づいて次のコードでパラメーターを指定します。重要クエリの時間範囲を制限するには、WHERE句に
__date__
または__time__
フィールドを含める必要があります。__date__
フィールドのデータ型はtimestampです。__time__
フィールドのデータ型はbigintです。 例:__date__ > '2017-08-07 00:00:00 'および__date__ < '2017-08-08 00:00:00'
__time__ > 1502691923および__time__ < 1502692923
import mysql.connector import os def main(): # The username. user = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '') # The password. password = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '') # The endpoint. host = 'cn-chengdu-intranet.log.aliyuncs.com' # The database name. project = 'aliyun-test-project' # The port number. port = 10005 # The Logstore name. logstore = 'logstore-test' print("collect database start ") # Connect to the database. cnx = mysql.connector.connect(host=host, user=user, password=password, database=database, port=port) print("collect database success ") # Create a cursor object. cursor = cnx.cursor() # Execute a query. 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") # Obtain the query result. for (column1) in cursor: print("{}".format(column1)) # Close the cursor and the connection. cursor.close() cnx.close() if __name__ == '__main__': main()
項目
説明
必須/任意
例
project
宛先プロジェクト。
あり
trip-デモ
logstore
宛先Logstore。
あり
logtore-test
endpoint
Alibaba Cloudが提供する内部エンドポイント。
あり
cn-hangzhou-intranet.log.aliyuncs.com
port
ポート番号。 値を10005に設定します。
あり
10005
user
Alibaba CloudアカウントのAccessKey ID。 RAM ユーザーの AccessKey ID の使用を推奨します。
あり
LT ******************* KX
password
Alibaba CloudアカウントのAccessKeyシークレット。 RAMユーザーのAccessKeyシークレットを使用することを推奨します。
あり
aaw ************************ Qf
次のいずれかのコマンドを実行してデータを照会します。
python mysqlQuery.py # Command for Python 2. python3 mysqlQuery.py # Command for Python 3.
ECSインスタンスを使用したSimple Log Serviceへの接続
次のコマンドを実行してSimple Log Serviceに接続します。
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
パラメーター
説明
ホスト
Simple Log Serviceエンドポイント。 エンドポイントにプロジェクト名を含める必要があります。
プロジェクト名. 内部エンドポイント
形式でエンドポイントを入力する必要があります。 例: my-project.cn-hangzhou-intranet.log.aliyuncs.com。クラシックネットワークまたは仮想プライベートクラウド (VPC) 経由でアクセス可能な内部エンドポイントのみがサポートされています。 詳細については、「エンドポイント」をご参照ください。
ポート
Simple Log Serviceへの接続に使用できるポート。 デフォルト値:10005
ユーザー
Alibaba CloudアカウントのAccessKey ID。 RAM ユーザーの AccessKey ID の使用を推奨します。
パスワード
Alibaba CloudアカウントのAccessKeyシークレット。 RAMユーザーのAccessKeyシークレットを使用することを推奨します。
私のプロジェクト
Simple Log Serviceプロジェクトの名前。
重要データベースは、一度に1つのプロジェクトにのみ接続できます。
次のコマンドを実行して、現在のプロジェクトを入力します。
use my-project;
データの照会
重要クエリの時間範囲を制限するには、WHERE句に
__date__
または__time__
フィールドを含める必要があります。__date__
フィールドのデータ型はtimestampです。__time__
フィールドのデータ型はbigintです。 例:__date__ > '2017-08-07 00:00:00 'および__date__ < '2017-08-08 00:00:00'
__time__ > 1502691923および__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'
1と2の値をプロジェクト名に置き換えます。
3とマークされた値をLogstore名に置き換えます。
検索と分析の構文
フィルタ構文
説明クエリの時間範囲を制限するには、WHERE句に __date__ または __time__ フィールドを含める必要があります。 __date__ フィールドのデータ型はtimestampです。 __time__ フィールドのデータ型はbigintです。 例:
__date__ > '2017-08-07 00:00:00 'および__date__ < '2017-08-08 00:00:00'
__time__ > 1502691923および__time__ < 1502692923
次の表に、WHERE句のフィルタリング構文を示します。
意味論
例
説明
文字検索
key = "value"
トークン化後にデータを照会します。
ファジー文字列検索
キーには「valu * 」があります
キーのような 'value_% '
トークン化後にファジー一致モードでデータを照会します。
数値比較
num_field > 1
比較演算子を使用してデータを照会します。 以下の比較演算子がサポートされています: greater-than (>) 、greater-than-or-equal-to (>=) 、less-than (<) 、less-than-or-equal-to (<=) 、およびequal-to (=) 。
論理演算
とまたはそうでない
論理操作に基づいてデータを照会します。 例: a = "x" and b ="y" およびa = "x" and not b ="y" 。
全文検索
__line__ ="abc"
フルテキスト検索に基づいてデータを照会します。 フルテキスト検索を実行する場合は、__line__ キーを使用する必要があります。
計算の構文
計算演算子がサポートされています。 詳細については、「ログ分析の概要」をご参照ください。
SQL-92 構文
次の例では、クエリステートメントは、フィルタリングと計算の構文を含むSQL-92構文を使用します。
status>200 |select avg(latency),max(latency) ,count(1) as c GROUP BY method ORDER BY c DESC LIMIT 20
次の例では、SQL文は標準のSQL-92構文を使用します。この構文には、前のクエリ文の分析文と時間条件が含まれています。
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