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

Simple Log Service:Simple Log Service SDK for Androidの使用を開始する

最終更新日:Sep 05, 2024

このトピックでは、Simple Log Service SDK for Androidを使用してログを収集する方法について説明します。

前提条件

Simple Log Service SDK for Androidがインストールされています。 詳細については、「Simple Log Service SDK For Androidのインストール」をご参照ください。

クイックスタート

次のメソッドを使用してSDKを初期化し、addLogメソッドを呼び出してSimple Log Serviceにログをアップロードできます。

重要
  • SDKを使用して、複数のインスタンスを初期化できます。 LogProducerConfigおよびLogProducerClientインスタンスを一度に初期化する必要があります。

  • Simple Log Serviceにログをアップロードする際の認証と改ざん防止には、Alibaba CloudアカウントまたはResource Access Management (RAM) ユーザーのAccessKeyペアを使用する必要があります。 AccessKeyペアをモバイルアプリに保存すると、リスクが発生する可能性があります。 リスクの発生を防ぐために、直接データ転送サービスに基づいてAccessKeyペアを設定し、モバイルアプリからSimple Log serviceにログをアップロードすることを推奨します。 詳細については、「モバイルアプリからSimple Log serviceにログをアップロードするサービスの構築」をご参照ください。

// We recommend that you globally save the LogProducerConfig and LogProducerClient instances. 
private LogProducerConfig config = null;
private LogProducerClient client = null;

/**
 * Initialize the SDK.
 */

private void initProducer() {
    try {
        // The Simple Log Service endpoint. The endpoint must start with https:// or http://. 
        final String endpoint = "your endpoint";
        final String project = "your project";
        final String logstore = "your logstore";

        config = new LogProducerConfig(context, endpoint, project, logstore);
        // The topic of logs. 
        config.setTopic("example_topic");
        // The tag, which is added to all logs. 
        config.addTag("example", "example_tag");

        // Specify whether to discard an expired log. The value 0 specifies that an expired log is not discarded and the time of the log is changed to the current time. The value 1 specifies that an expired log is discarded. Default value: 1. 
        config.setDropDelayLog(0);
        // Specify whether to discard a log for which authentication failed. The value 0 specifies that a log is not discarded. The value 1 specifies that a log is discarded. Default value: 0. 
        config.setDropUnauthorizedLog(0);

        // The LogProducerCallback method is optional. You do not need to register a callback if you are not concerned about whether a log is successfully uploaded. 
        // If you need to dynamically configure an AccessKey pair, we recommend that you configure the LogProducerCallback method and configure settings to update the AccessKey pair when you call the onCall method. 
        final LogProducerCallback callback = new LogProducerCallback() {
            @Override
            public void onCall(int resultCode, String reqId, String errorMessage, int logBytes, int compressedBytes) {
                // resultCode: the status code. For more information, see the "Error codes" section in this topic. 
                // reqId: the request ID. This parameter is deprecated. 
                // errorMessage: the error message. 
                // logBytes: the total number of bytes in the raw log. 
                // compressedBytes: the number of bytes in the log after compression. 

                final LogProducerResult result = LogProducerResult.fromInt(resultCode);
                if (LogProducerResult.LOG_PRODUCER_SEND_UNAUTHORIZED == result || LogProducerResult.LOG_PRODUCER_PARAMETERS_INVALID == result) {
                    // Update the AccessKey pair or the parameters required for SDK initialization. 
                }
            }
        };
      
        // Pass callback as the second parameter if you are concerned about whether a log is successfully uploaded. 
        client = new LogProducerClient(config, callback);
    } catch (LogProducerException e) {
        e.printStackTrace();
    }
}
// Query the AccessKey pair. 
private void requestAccessKey() {
    // We recommend that you configure an AccessKey pair based on the direct data transfer service. 
    // ...

    // After you obtain the AccessKey pair, initiate a call to update the AccessKey pair. 
    updateAccessKey(accessKeyId, accessKeySecret, securityToken);
}

// Update the AccessKey pair. 
private void updateAccessKey(String accessKeyId, String accessKeySecret, String securityToken) {
    // If you obtain an AccessKey pair by using Security Token Service (STS), the AccessKey pair contains securityToken. In this case, you must update the AccessKey pair by using the following method: 
    if (null != securityToken && !"".equals(securityToken)) {
        config.resetSecurityToken(accessKeyId, accessKeySecret, securityToken);
    } else {
        // If you obtain an AccessKey pair by using a method other than STS, update the AccessKey pair by using the following method: 
        config.setAccessKeyId(accessKeyId);
        config.setAccessKeySecret(accessKeySecret);
    }
}

/**
 * Upload logs.
 */
public void addLog() {
    Log log = new Log();
    // Adjust the fields that you want to upload based on your business requirements. 
    log.putContent("content_key_1", 123456);
    log.putContent("content_key_2", 23.34f);
    log.putContent("content_key_3", "Chinese");
    log.putContent(null, "null");
    log.putContent("null", (String) null);
    client.addLog(log);
}

高度な操作

動的にパラメーターを設定

Simple Log Service SDK for Androidを使用して、Endpoint、Project、Logstore、およびAccessKeyパラメーターを動的に設定できます。

  • Endpoint、Project、およびLogstoreパラメーターを動的に設定します。

    // You can configure one or more of the Endpoint, Project, and Logstore parameters at a time. 
    // Update the endpoint. 
    config.setEndpoint("your new-endpoint");
    // Update the project name. 
    config.setProject("your new-project");
    // Update the Logstore name. 
    config.setLogstore("your new-logstore");
  • AccessKeyパラメーターを動的に設定します。

    AccessKeyペアを動的に設定する場合は、LogProducerCallbackメソッドも設定することを推奨します。

    // If the LogProducerCallback method is initialized when you initialize the LogProducerClient instance, ignore the following code: 
    final LogProducerCallback callback = new LogProducerCallback() {
        @Override
        public void onCall(int resultCode, String reqId, String errorMessage, int logBytes, int compressedBytes) {
            // resultCode: the status code. For more information, see the "Error codes" section of this topic. 
            // reqId: the request ID. This parameter is deprecated. 
            // errorMessage: the error message. 
            // logBytes: the total number of bytes in the raw log. 
            // compressedBytes: the number of bytes in the log after compression. 
    
            final LogProducerResult result = LogProducerResult.fromInt(resultCode);
            if (LogProducerResult.LOG_PRODUCER_SEND_UNAUTHORIZED == result || LogProducerResult.LOG_PRODUCER_PARAMETERS_INVALID == result) {
                // Update the AccessKey pair or the parameters required for SDK initialization. 
                requestAccessKey();
            }
        }
    };
    
    // Pass callback as the second parameter if you are concerned about whether a log is successfully uploaded. 
    client = new LogProducerClient(config, callback);
    
    // Query the AccessKey pair. 
    private void requestAccessKey() {
        // We recommend that you configure an AccessKey pair based on the direct data transfer service. 
        // ...
    
        // After you obtain the AccessKey pair, initiate a call to update the AccessKey pair. 
        updateAccessKey(accessKeyId, accessKeySecret, securityToken);
    }
    
    // Update the AccessKey pair. 
    private void updateAccessKey(String accessKeyId, String accessKeySecret, String securityToken) {
        // If you obtain an AccessKey pair by using STS, the AccessKey pair contains securityToken. In this case, you must update the AccessKey pair by using the following method: 
        if (null != securityToken && !"".equals(securityToken)) {
            config.resetSecurityToken(accessKeyId, accessKeySecret, securityToken);
        } else {
            // If you obtain an AccessKey pair by using a method other than STS, update the AccessKey pair by using the following method: 
            config.setAccessKeyId(accessKeyId);
            config.setAccessKeySecret(accessKeySecret);
        }
    }
  • Source、Topic、およびTagパラメーターを動的に設定します。

    重要

    Source、Topic、またはTagパラメーターは、特定の種類のログに対してのみ設定できます。 Source、Topic、およびTagパラメーターの設定は、Simple Log Serviceへのアップロードに失敗したログに対して有効になります。 Source、Topic、およびTagパラメーターに基づいて特定の種類のログをトレースする場合、結果が期待どおりでない場合があります。 生成されるログの種類を識別するために、新しいフィールドを追加することを推奨します。

    // The source of logs. 
    config.setSource("your new-source");
    // The topic of logs. 
    config.setTopic("your new-topic");
    // The tag, which is added to all logs. 
    config.addTag("test", "your new-tag");

再開可能アップロードの実行

Simple Log Service SDK for Androidは、再開可能なアップロードをサポートしています。 再開可能アップロードを有効にすると、addLogメソッドを使用してSimple Log Serviceに書き込まれたログは、ローカルのbinlogファイルに一時的に保存されます。 ログがSimple Log Serviceに正常にアップロードされると、ログはローカルファイルから削除されます。 これにより、ログのアップロード中に少なくとも1回のセマンティクスが正常に実装されます。

SDKを初期化して再開可能なアップロードを有効にするときに、次のコードを追加できます。

重要
  • 複数のLogProducerConfigインスタンスを初期化する場合、LogProducerConfigクラスのsetPersistentFilePathメソッドに異なる値を渡す必要があります。

  • 複数のプロセスが実行されており、アプリで再開可能なアップロードが有効になっている場合は、メインプロセスでSDKを初期化するだけで済みます。 子プロセスを実行してデータを収集する場合は、一意のファイルパスをsetPersistentFilePathメソッドに渡す必要があります。 そうしないと、ログが乱れたり失われたりします。

  • 再開可能なアップロードを有効にした後、複数のスレッドの設定によってLogProducerConfigインスタンスが繰り返し初期化されることに注意してください。

private void initProducer() {
    // The value 1 specifies that resumable upload is enabled. The value 0 specifies that resumable upload is disabled. Default value: 0. 
    config.setPersistent(1);
    // The name of the persistent file. Make sure that the folder in which the file is stored is created. 
    final String persistentFilePath = getFilesDir() + File.separator + "log_data";
    config.setPersistentFilePath(persistentFilePath);
    // The number of persistent files that can be rolled. We recommend that you set the parameter to 10. 
    config.setPersistentMaxFileCount(10);
    // The size of a persistent file. Unit: bytes. The value is calculated based on the following formula: N × 1024 × 1024. We recommend that you set N to a value ranging from 1 to 10. 
    config.setPersistentMaxFileSize(N*1024*1024);
    // The number of logs that can be cached on your computer. We recommend that you do not set the parameter to a value greater than 1048576. Default value: 65536. 
    config.setPersistentMaxLogCount(65536);
}

難読化ルール

-keep class com.aliyun.sls.android.producer.* { *; }
-keep interface com.aliyun.sls.android.producer.* { *; }

Android権限

<uses-permission android:name="android.permission.INTERNET" />

パラメーター

次の表に、LogProducerConfigクラスによって提供されるパラメーターを示します。

パラメーター

データ型

説明

setTopic

String

トピック。 デフォルト値は空の文字列です。

addTag

String

タグです。 タグはtag:xxxx形式です。 デフォルト値は空の文字列です。

setSource

String

ソース。 デフォルト値: Android。

setPacketLogBytes

Int

キャッシュされたログパケットのサイズの上限。 サイズが上限に達すると、ログパケット内のログはすぐにSimple log Serviceにアップロードされます。

有効な値: 1 ~ 5242880 デフォルト値は、1024 × 1024の式に基づいて計算されます。 単位:バイト

setPacketLogCount

Int

キャッシュされたログパケット内のログ数の上限。 上限に達すると、ログパケット内のログはすぐにSimple log Serviceにアップロードされます。

有効な値: 1 ~ 4096 デフォルト値: 1024。

setPacketTimeout

Int

キャッシュされたログをアップロードするためのタイムアウト期間。 キャッシュされたログがタイムアウトすると、キャッシュされたログはすぐにSimple Log Serviceにアップロードされます。

既定値:3000。 単位:ミリ秒。

setMaxBufferLimit

Int

LogProducerClientインスタンスで使用できるメモリの上限。 消費されるメモリが上限に達すると、addLogメソッドの呼び出しに失敗し、エラーメッセージが返されます。

デフォルト値は、64 × 1024 × 1024の式に基づいて計算されます。

setSendThreadCount

Int

ログのアップロードに使用されるスレッドの数。 再開可能なアップロードを有効にすると、値は1に固定されます。

setPersistent

Int

再開可能アップロードを有効にするかどうかを指定します。 有効な値:

  • 1: はい。

  • 0 (デフォルト): いいえ。

setPersistentFilePath

String

永続ファイルの名前。 ファイルが格納されているフォルダが作成されていることを確認してください。 複数のLogProducerConfigインスタンスを設定する場合は、setPersistentFilePathパラメーターに一意の値を指定します。

このパラメーターはデフォルトで空となります。

setPersistentForceFlush

Int

addLogメソッドの呼び出しごとに強制更新を有効にするかどうかを指定します。 有効な値:

  • 1: はい。 強制更新を有効にすると、システムのパフォーマンスに影響します。 作業は慎重に行ってください。

  • 0 (デフォルト): いいえ。

信頼性の高いシナリオでは、強制的な更新を有効にすることを推奨します。

setPersistentMaxFileCount

Int

ロールできる永続ファイルの数。 パラメーターを10に設定することを推奨します。 デフォルト値:0

setPersistentMaxFileSize

Int

永続ファイルのサイズ。 単位: バイト。 この値は、N × 1024 × 1024の式に基づいて計算される。 Nを1から10の範囲の値に設定することを推奨します。

setPersistentMaxLogCount

Int

コンピュータにキャッシュできるログの数。 パラメーターを1048576を超える値に設定しないことを推奨します。 デフォルト値: 65536

setConnectTimeoutSec

Int

ネットワーク接続のタイムアウト期間。 デフォルト値は 10 です。 単位は秒です。

setSendTimeoutSec

Int

ログをアップロードするためのタイムアウト期間。 デフォルト値: 15。 単位は秒です。

setDestroyFlusherWaitSec

Int

フラッシャー糸が破壊されるまでの最大待ち時間。 デフォルト値は 1 です。 単位は秒です。

setDestroySenderWaitSec

Int

破棄される送信者スレッドプールの最大待機時間。 デフォルト値は 1 です。 単位は秒です。

setCompressType

Int

データのアップロード中に使用される圧縮方法。 有効な値:

  • 0: データは圧縮されない。

  • 1 (デフォルト): データはLZ4アルゴリズムを使用して圧縮されます。

setNtpTimeOffset

Int

システム時間と標準時間の差。 この値は、次の式に基づいて計算されます。標準時間-デバイス時間。 ほとんどの場合、システム時刻が標準時刻と同期していないため、差分が発生します。 デフォルト値: 0。 単位: 秒。

setMaxLogDelayTime

Int

ログの時刻とシステム時刻の差の上限。 差が上限に達した場合、SDKはsetDropDelayLogパラメーターの値に基づいてログを処理します。 デフォルト値: 7243600。これは7日に相当します。 単位: 秒。

setDropDelayLog

Int

期限切れのログを破棄するかどうかを指定します。 ログの時刻とシステム時刻の差がsetMaxLogDelayTimeパラメーターの値を超える場合、ログは期限切れログと見なされます。 有効な値:

  • 0 (デフォルト): 期限切れのログは破棄されず、ログの時刻は現在の時刻に変更されます。

  • 1: 期限切れのログは破棄されます。

setDropUnauthorizedLog

Int

認証に失敗したログを破棄するかどうかを指定します。 有効な値:

  • 0 (デフォルト): いいえ。

  • 1: はい。

setCallbackFromSenderThread

Boolean

送信者スレッドにコールバックを実装するかどうかを指定します。 有効な値:

  • true (デフォルト): 送信者スレッドにコールバックを実装します。

  • false: メインスレッドにコールバックを実装します。

エラーコード

次の表に、LogProducerResultクラスで定義されるエラーコードを示します。

エラーコード

説明

解決策

LOG_PRODUCER_OK

0

ログはSimple Log Serviceにアップロードされます。

N/A。

LOG_PRODUCER_INVALID

1

SDKが破棄または無効です。

  1. SDKが初期化されているかどうかを確認します。

  2. destroy() メソッドが呼び出されているかどうかを確認します。

LOG_PRODUCER_WRITE_ERROR

2

プロジェクトの書き込みトラフィックが上限に達したため、データの書き込みエラーが発生します。

プロジェクトの書き込みトラフィックの上限を調整します。 詳細については、「リソースクォータの調整」をご参照ください。

LOG_PRODUCER_DROP_ERROR

3

ディスク容量またはメモリが不足しているため、ログをSimple Log Serviceにアップロードできません。

maxBufferLimit、persistentMaxLogCount、およびpersistentMaxFileSizeパラメーターを変更し、ログをSimple Log Serviceに再度アップロードします。

LOG_PRODUCER_SEND_NETWORK_ERROR

4

ネットワークエラーが発生した場合。

Endpoint、Project、およびLogstoreパラメーターの設定を確認します。

LOG_PRODUCER_SEND_QUOTA_ERROR

5

プロジェクトの書き込みトラフィックが上限に達しました。

プロジェクトの書き込みトラフィックの上限を調整します。 詳細については、「リソースクォータの調整」をご参照ください。

LOG_PRODUCER_SEND_UNAUTHORIZED

6

AccessKeyペアが期限切れまたは無効であるか、AccessKeyペアが属するRAMユーザーのポリシーが正しく設定されていません。

AccessKeyペアを確認します。

RAMユーザーがSimple Log Serviceリソースに対する管理権限を持っていることを確認します。 詳細については、「RAMユーザーを作成し、RAMユーザーにSimple Log Serviceへのアクセスを許可する」をご参照ください。

LOG_PRODUCER_SEND_SERVER_ERROR

7

サービスエラーが発生しました。

送信する テクニカルサポートに連絡するチケット

LOG_PRODUCER_SEND_DISCARD_ERROR

8

システム時刻がサーバー時刻と同期していないため、データは破棄されます。

SDKは自動的にデータを再度アップロードします。

LOG_PRODUCER_SEND_TIME_ERROR

9

ログの時刻がサーバー時刻と同期していません。

SDKは自動的にエラーを修正します。

LOG_PRODUCER_SEND_EXIT_BUFFERED

10

SDKが破棄されても、キャッシュされたデータはSimple Log Serviceにアップロードされません。

データの損失を防ぐため、再開可能なアップロードを有効にすることを推奨します。

LOG_PRODUCER_PARAMETERS_INVALID

11

SDKの初期化中にパラメーターエラーが発生しました。

AccessKey、Endpoint、Project、およびLogstoreパラメーターの設定を確認します。

LOG_PRODUCER_PERSISTENT_ERROR

99

キャッシュされたデータのシステムディスクへの書き込みに失敗しました。

1. キャッシュされたファイルのパスが正しく設定されているか確認します。

2. キャッシュされたファイルがいっぱいかどうかを確認します。

3. システムのディスク容量が十分かどうかを確認します。

よくある質問

重複ログが存在するのはなぜですか?

Simple Log Service SDK for Androidは、ログを非同期にアップロードします。 ネットワークの状態が悪いため、ログのアップロードに失敗することがあります。 この場合、ログは再びアップロードされます。 ログアップロードは、ステータスコード200が返された場合にのみ成功と見なされます。 したがって、重複ログが存在する可能性があります。 クエリ文を実行してログの重複を排除することを推奨します。

重複率が高い場合は、SDKの初期化中にエラーが発生していないか確認する必要があります。 次のリストは、ログを複製する原因と解決策を示しています。

  • 再開可能アップロードの設定が無効です

    setPersistentFilePathパラメーターに一意の値が指定されているかどうかを確認します。

  • SDKの初期化の複製

    • ほとんどの場合、重複したSDK初期化は、単一インスタンスの無効な書き込み、またはSDK初期化がシングルトンモードでカプセル化されていないために発生します。 次の方法に基づいてSDKの初期化を完了することを推奨します。

      public class AliyunLogHelper {
          private LogProducerConfig config;
          private LogProducerClient client;
      
          private static class Holder {
              private static final AliyunLogHelper INSTANCE = new AliyunLogHelper();
          }
      
          public static AliyunLogHelper getInstance() {
              return Holder.INSTANCE;
          }
      
          private AliyunLogHelper() {
              initProducer();
          }
      
          private void initProducer() {
              // Replace the following code with your code for SDK initialization. 
              try {
                  config = new LogProducerConfig();
                  client = new LogProducerClient(config);
              } catch (LogProducerException e) {
                  e.printStackTrace();
              }
          }
      
          public void addLog(Log log) {
              if (null == client) {
                  return;
              }
      
              client.addLog(log);
          }
      }
    • 複数のプロセスでSDKの初期化が重複することもあります。 メインプロセスでのみSDKを初期化するか、複数のプロセスでSDKを初期化する場合はsetPersistentFilePathパラメーターに異なる値を指定することを推奨します。

  • 悪いネットワーク条件

    悪いネットワーク条件でアプリを実行する場合は、次の例に基づいてSDK初期化のパラメーターを再設定することをお勧めします。

    // Initialize the SDK. 
    private void initProducer() {
        // Change the timeout periods for HTTP connections and log upload to decrease the duplication rate of logs. 
        // You can change the timeout periods based on your business requirements. 
        config.setConnectTimeoutSec(20);
        config.setSendTimeoutSec(20);
      
        // Configure other parameters for SDK initialization. 
        // ...
    }

ログが失われた場合はどうすればよいですか?

ログは非同期にアップロードされます。 ログがアップロードされる前にアプリを閉じた場合、ログをアップロードできず、失われる可能性があります。 再開可能アップロードを有効にすることを推奨します。 詳細については、「再開可能なアップロード」をご参照ください。

ログのアップロード中にレイテンシが存在する場合はどうすればよいですか。

ログは非同期にアップロードされます。 ネットワークの状態が悪く、アプリの特定のシナリオが原因で、ログがすぐにアップロードされない場合があります。 レイテンシが複数のデバイスにのみ存在する場合、これは正常です。 それ以外の場合は、次のエラーコードに基づいて問題をトラブルシューティングします。

エラーコード

説明

LOG_PRODUCER_SEND_NETWORK_ERROR

Endpoint、Project、およびLogstoreパラメーターが正しく設定されているかどうかを確認します。

LOG_PRODUCER_SEND_UNAUTHORIZED

AccessKeyペアが期限切れまたは有効かどうか、またはAccessKeyペアが属するRAMユーザーのポリシーが正しく設定されているかどうかを確認します。

LOG_PRODUCER_SEND_QUOTA_ERROR

プロジェクトの書き込みトラフィックが上限に達しました。 プロジェクトの書き込みトラフィックの上限を調整します。 詳細については、「リソースクォータの調整」をご参照ください。