除日志服务提供的API接口外,您还可以使用JDBC + 标准SQL 92进行日志查询与分析。

前提条件

访问JDBC接口,必须使用主账号的Accesskey或者子账号的Accesskey。如果使用子账号Accesskey,则子账号必须是当前Project所属主账号的子账号,且子账号必须具有Project级别的读权限。
说明 MySQL JDBC不支持分页。

连接参数

连接参数 示例 说明
host regionid.example.com 服务入口,目前仅支持经典网络内网访问和VPC网络访问。
port 10005 默认使用10005作为端口号。
user bq2sjzesjmo86kq 访问密钥AccesskeyId。
password 4fdO1fTDDuZP 访问密钥AccessKeySecret。
database sample-project 账号下的项目(Project)
table sample-logstore 项目下的日志库(Logstore)
例如通过MySQL命令连接,示例如下:
mysql -hcn-shanghai-intranet.log.aliyuncs.com -ubq2sjzesjmo86kq -p4fdO1fTDDuZP -P10005
use sample-project; // 使用某个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
上述两种条件必须出现一个。
  • 过滤语法
    关于where下过滤(filter)语法如下:
    语义 示例 说明
    字符串搜索 key = "value" 查询的是分词之后的结果。
    字符串模糊搜索 key = "valu*" 查询的是分词之后模糊匹配的结果。
    数值比较 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

通过JDBC协议访问

  • 程序调用

    开发者可以在任何一个支持MySQL connector的程序中使用MySQL语法连接日志服务。例如使用JDBC或者Python MySQLdb。

    使用样例:
    import com.mysql.jdbc.*;
    import java.sql.*;
    import java.sql.Connection;
    import java.sql.ResultSetMetaData;
    import java.sql.Statement;
    public class testjdbc {
        public static void main(String args[]){
            Connection conn = null;
            Statement stmt = null;
            try {
                //STEP 2: Register JDBC driver
                Class.forName("com.mysql.jdbc.Driver");
                //STEP 3: Open a connection
                System.out.println("Connecting to a selected database...");
                conn = DriverManager.getConnection("jdbc:mysql://cn-shanghai-intranet.log.aliyuncs.com:10005/sample-project","accessid","accesskey");
                System.out.println("Connected database successfully...");
                //STEP 4: Execute a query
                System.out.println("Creating statement...");
                stmt = conn.createStatement();
                String sql = "SELECT method,min(latency,10)  as c,max(latency,10) from sample-logstore where  __time__>=1500975424 and __time__ < 1501035044 and latency > 0  and latency < 6142629 and  not (method='Postlogstorelogs' or method='GetLogtailConfig') group by method " ;
                String sql_example2 = "select count(1) ,max(latency),avg(latency), histogram(method),histogram(source),histogram(status),histogram(clientip),histogram(__source__) from  test10 where __date__  >'2017-07-20 00:00:00'  and  __date__ <'2017-08-02 00:00:00' and __line__='abc#def' and latency < 100000 and (method = 'getlogstorelogS' or method='Get**' and method <> 'GetCursorOrData' )";
                String sql_example3 = "select count(1) from  sample-logstore where     __date__  >       '2017-08-07 00:00:00' and  __date__ <     '2017-08-08 00:00:00' limit 100";
                ResultSet rs = stmt.executeQuery(sql);
                //STEP 5: Extract data from result set
                while(rs.next()){
                    //Retrieve by column name
                    ResultSetMetaData data = rs.getMetaData();
                    System.out.println(data.getColumnCount());
                    for(int i = 0;i < data.getColumnCount();++i) {
                        String name = data.getColumnName(i+1);
                        System.out.print(name+":");
                        System.out.print(rs.getObject(name));
                    }
                    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();
                    }
                }
            }
        }
    }
  • 工具类调用
    在经典网内网/VPC环境通过MySQL Client进行连接。
    图 1. 连接示例
    连接示例
    说明
    • ①处填写您的Project。
    • ②处填写您的Logstore。