すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:SQL文を使用したログのクエリと分析

最終更新日:Sep 10, 2024

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への接続

  1. Mavenプロジェクトを作成し、次のJDBC依存関係をプロジェクトのpom.xmlファイルに追加します。 サンプルコード:

    <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.49</version>
    </dependency>
  2. 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シークレット。

    あり

    -

  3. データの照会

    image

MySQL Connector/Pythonを使用したSimple Log Serviceへの接続

  1. コマンドラインツールで、管理者として次のいずれかのコマンドを実行して、mysql-connector-pythonをインストールします。

    pip install mysql-connector-python # Command for Python 2.
    pip3 install mysql-connector-python # Command for Python 3.
  2. 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

  3. 次のいずれかのコマンドを実行してデータを照会します。

    python mysqlQuery.py # Command for Python 2.
    python3 mysqlQuery.py # Command for Python 3.

    image

ECSインスタンスを使用したSimple Log Serviceへの接続

  1. 次のコマンドを実行して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つのプロジェクトにのみ接続できます。

  2. 次のコマンドを実行して、現在のプロジェクトを入力します。

    use my-project;
  3. データの照会

    重要

    クエリの時間範囲を制限するには、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