阿里雲日誌服務Rest API使用示例參考

概述

日誌服務(Log Service,簡稱 LOG)是針對日誌類數據的一站式服務,在阿里巴巴集團經歷大量大數據場景錘鍊而成。用戶除了通過管理控制檯進行操作外,LOG 還提供了 API(Application Programming Interface)方式寫入、查詢日誌數據,管理自己的項目及日誌庫等。在實際的開發使用過程中,我們建議用戶使用官方提供的最新版SDK。直接使用Rest API相對比較麻煩,特別是在簽名的生成過程中很容易出錯,且不易排查。下面主要介紹CreateProject、DeleteProject和ListLogstore三個API的使用示例,相關示例使用JAVA語言。

相關依賴

<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.4</version>
</dependency>

示例代碼

CreateProject
import net.sf.json.JSONObject;
import org.apache.commons.codec.binary.Base64;
import java.math.BigInteger;
import java.net.URI;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

//創建project操作
public class CreateProject {

    public static void main(String[] args){

        //獲取GMT英文格式時間
        Date d=new Date();
        DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的時間轉換時需要帶上Locale.ENGLISH,否則會轉換失敗,因爲它默認的是本地化的設置,除非你的操作系統是英文的,總之時間轉換時需要時間格式與模式保持一致。
        format.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = format.format(d);

        //參數設置
        String projectName = "restapiproject";//日誌服務項目名稱
        String projectDescription = "sample_demo";//日誌服務項目描述
        String AccessKeySecret = "********";//Access Key Secret
        String AccessKeyId = "********";//AccessKey ID

        JSONObject jsonBody = new JSONObject();
        jsonBody.put("projectName", projectName);
        jsonBody.put("description", projectDescription);

        //構造請求body
        String body = jsonBody.toString();
        System.out.println("jsonBody: " + jsonBody.toString());
        String md5 = md5(body).toUpperCase();
        md5 = md5.toUpperCase();//小寫字母轉大寫

        //構造簽名String
        String SignString = "POST\n" +
                md5+"\n"+
                "application/json\n" +
                date + "\n"+
                "x-log-apiversion:0.6.0\n" +
                "x-log-bodyrawsize:0\n" +
                "x-log-signaturemethod:hmac-sha1\n" + "/";

        String sign = encode(AccessKeySecret,SignString);

        String Authorization = "LOG " + AccessKeyId + ":" + sign;
        HttpClient httpclient = HttpClients.createDefault();

        try
        {
            URIBuilder builder = new URIBuilder("http://"+projectName+".cn-qingdao.log.aliyuncs.com");//在青島區域創建Project
            URI uri = builder.build();
            HttpPost request = new HttpPost(uri);
            request.setHeader("Authorization", Authorization);
            request.setHeader("Date", date);
            request.setHeader("Host", projectName + ".cn-qingdao.log.aliyuncs.com");
            request.setHeader("x-log-apiversion", "0.6.0");
            request.setHeader("x-log-signaturemethod", "hmac-sha1");
            request.setHeader("Content-Type","application/json");
            request.setHeader("User-Agent","sls-java-sdk-v-0.6.1");
            request.setHeader("x-log-bodyrawsize","0");
            request.setHeader("Content-MD5", md5);

            // Request body
            StringEntity reqEntity = new StringEntity(body,"UTF-8");
            request.setEntity(reqEntity);

            HttpResponse response = httpclient.execute(request);
            HttpEntity entity = response.getEntity();

            if (entity != null)
            {
                System.out.println("項目創建成功!");
                System.out.println(EntityUtils.toString(entity));
            }
        }
        catch (Exception e)
        {
            System.out.println("error");
            System.out.println(e.getMessage());
        }
    }

    //寫一個md5加密的方法
    public static String md5(String plainText) {
        //定義一個字節數組
        byte[] secretBytes = null;
        try {
            // 生成一個MD5加密計算摘要
            MessageDigest md = MessageDigest.getInstance("MD5");
            //對字符串進行加密
            md.update(plainText.getBytes());
            //獲得加密後的數據
            secretBytes = md.digest();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("沒有md5這個算法!");
        }
        //將加密後的數據轉換爲16進制數字
        String md5code = new BigInteger(1, secretBytes).toString(16);// 16進制數字
        // 如果生成數字未滿32位,需要前面補0
        for (int i = 0; i < 32 - md5code.length(); i++) {
            md5code = "0" + md5code;
        }
        return md5code;
    }

    //計算簽名
    public static String encode(String accessKey, String data) {
        try {
            byte[] keyBytes = accessKey.getBytes("UTF-8");
            byte[] dataBytes = data.getBytes("UTF-8");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));
            return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));
        } catch (UnsupportedEncodingException var5) {
            throw new RuntimeException("Not supported encoding method UTF-8", var5);
        } catch (NoSuchAlgorithmException var6) {
            throw new RuntimeException("Not supported signature method hmac-sha1", var6);
        } catch (InvalidKeyException var7) {
            throw new RuntimeException("Failed to calculate the signature", var7);
        }
    }
}
Delete Project
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URI;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

//刪除project的操作
public class DeleProject {

    public static void main(String[] args){

        //獲取GMT英文格式時間
        Date d=new Date();
        DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的時間轉換時需要帶上Locale.ENGLISH,否則會轉換失敗,因爲它默認的是本地化的設置,除非你的操作系統是英文的,總之時間轉換時需要時間格式與模式保持一致。
        format.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = format.format(d);

        String AccessKeySecret = "********";
        String AccessKeyId = "********";
        String projectName = "restapiproject";//刪除的project名稱

        String SignString = "DELETE\n" +
                "\n"+
                "application/x-protobuf\n" +
                date + "\n"+
                "x-log-apiversion:0.6.0\n" +
                "x-log-bodyrawsize:0\n" +
                "x-log-signaturemethod:hmac-sha1\n"+"/";

        String sign = encode(AccessKeySecret,SignString);
        String Authorization = "LOG " + AccessKeyId + ":" + sign;
        HttpClient httpclient = HttpClients.createDefault();

        try
        {
            URIBuilder builder = new URIBuilder("http://"+projectName+".cn-qingdao.log.aliyuncs.com/");
            URI uri = builder.build();
            HttpDelete request = new HttpDelete(uri);

            request.setHeader("Authorization", Authorization);
            request.setHeader("Date", date);
            request.setHeader("Host", projectName + ".cn-qingdao.log.aliyuncs.com");
            request.setHeader("x-log-apiversion", "0.6.0");
            request.setHeader("x-log-signaturemethod", "hmac-sha1");
            request.setHeader("Content-Type","application/x-protobuf");
            request.setHeader("User-Agent","sls-java-sdk-v-0.6.1");
            request.setHeader("x-log-bodyrawsize","0");

            HttpResponse response = httpclient.execute(request);
            HttpEntity entity = response.getEntity();

            if (entity != null)
            {
                System.out.println(EntityUtils.toString(entity));
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }

    //寫一個md5加密的方法
    public static String md5(String plainText) {
        //定義一個字節數組
        byte[] secretBytes = null;
        try {
            // 生成一個MD5加密計算摘要
            MessageDigest md = MessageDigest.getInstance("MD5");
            //對字符串進行加密
            md.update(plainText.getBytes());
            //獲得加密後的數據
            secretBytes = md.digest();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("沒有md5這個算法!");
        }
        //將加密後的數據轉換爲16進制數字
        String md5code = new BigInteger(1, secretBytes).toString(16);// 16進制數字
        // 如果生成數字未滿32位,需要前面補0
        for (int i = 0; i < 32 - md5code.length(); i++) {
            md5code = "0" + md5code;
        }
        return md5code;
    }

    public static String encode(String accessKey, String data) {
        try {
            byte[] keyBytes = accessKey.getBytes("UTF-8");
            byte[] dataBytes = data.getBytes("UTF-8");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));
            return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));
        } catch (UnsupportedEncodingException var5) {
            throw new RuntimeException("Not supported encoding method UTF-8", var5);
        } catch (NoSuchAlgorithmException var6) {
            throw new RuntimeException("Not supported signature method hmac-sha1", var6);
        } catch (InvalidKeyException var7) {
            throw new RuntimeException("Failed to calculate the signature", var7);
        }
    }
}
ListLogstore
import org.apache.commons.codec.binary.Base64;
import java.net.URI;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

//列出指定項目Project下面的日誌庫
public class GetProjectLogstores {

    public static void main(String[] args){

        //獲取GMT英文格式時間
        Date d=new Date();
        DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z",Locale.ENGLISH);//英文格式的時間轉換時需要帶上Locale.ENGLISH,否則會轉換失敗,因爲它默認的是本地化的設置,除非你的操作系統是英文的,總之時間轉換時需要時間格式與模式保持一致。
        format.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = format.format(d);

        //參數設置
        String projectName = "taroslproject";//項目名稱
        String AccessKeySecret = "********";
        String AccessKeyId = "********";

        String SignString = "GET\n" +
                "\n" +
                "application/x-protobuf\n" +
                date + "\n"+
                "x-log-apiversion:0.6.0\n" +
                "x-log-bodyrawsize:0\n" +
                "x-log-signaturemethod:hmac-sha1\n" +
                "/logstores?logstoreName=&offset=0&size=100";

        String sign = encode(AccessKeySecret,SignString);
        String Authorization = "LOG " + AccessKeyId + ":" + sign;
        HttpClient httpclient = HttpClients.createDefault();

        try
        {
            URIBuilder builder = new URIBuilder("http://"+projectName+".cn-qingdao.log.aliyuncs.com/logstores");
            builder.setParameter("offset", "0");
            builder.setParameter("size", "100");
            builder.setParameter("logstoreName", "");
            URI uri = builder.build();
            HttpGet request = new HttpGet(uri);
            request.setHeader("Authorization", Authorization);
            request.setHeader("Date", date);
            request.setHeader("Host", projectName + ".cn-qingdao.log.aliyuncs.com");
            request.setHeader("x-log-apiversion", "0.6.0");
            request.setHeader("x-log-signaturemethod", "hmac-sha1");
            request.setHeader("Content-Length","0");
            request.setHeader("Content-Type","application/x-protobuf");
            request.setHeader("User-Agent","sls-java-sdk-v-0.6.1");
            request.setHeader("x-log-bodyrawsize","0");

            HttpResponse response = httpclient.execute(request);
            HttpEntity entity = response.getEntity();

            if (entity != null)
            {
                System.out.println(EntityUtils.toString(entity));
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }

    }

    public static String encode(String accessKey, String data) {
        try {
            byte[] keyBytes = accessKey.getBytes("UTF-8");
            byte[] dataBytes = data.getBytes("UTF-8");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(new SecretKeySpec(keyBytes, "HmacSHA1"));
            return new String(Base64.encodeBase64(mac.doFinal(dataBytes)));
        } catch (UnsupportedEncodingException var5) {
            throw new RuntimeException("Not supported encoding method UTF-8", var5);
        } catch (NoSuchAlgorithmException var6) {
            throw new RuntimeException("Not supported signature method hmac-sha1", var6);
        } catch (InvalidKeyException var7) {
            throw new RuntimeException("Failed to calculate the signature", var7);
        }
    }
}

建議

在實際的使用過程中,當必須要直接使用Rest API,如果僅僅參考API的文檔說明,測試出現問題的時候排查比較困難。目前Java語言的SDK實現了全部的API,建議可以參考Java SDK的源碼編寫自己的功能函數。

參考鏈接

API參考
Java SDK

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章