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

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

最終更新日:Jan 20, 2025

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

前提条件

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

クイックスタート

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

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

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

@interface ProducerExampleController ()
// We recommend that you globally save the LogProducerConfig and LogProducerClient instances. 
@property(nonatomic, strong) LogProducerConfig *config;
@property(nonatomic, strong) LogProducerClient *client;
@end

@implementation ProducerExampleController


// The callback 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 callback method and configure settings to update the AccessKey pair when you call the callback method. 
static void _on_log_send_done(const char * config_name, log_producer_result result, size_t log_bytes, size_t compressed_bytes, const char * req_id, const char * message, const unsigned char * raw_buffer, void * userparams) {
    if (result == LOG_PRODUCER_OK) {
        NSString *success = [NSString stringWithFormat:@"send success, config : %s, result : %d, log bytes : %d, compressed bytes : %d, request id : %s", config_name, (result), (int)log_bytes, (int)compressed_bytes, req_id];
        SLSLogV("%@", success);
    } else {
        NSString *fail = [NSString stringWithFormat:@"send fail   , config : %s, result : %d, log bytes : %d, compressed bytes : %d, request id : %s, error message : %s", config_name, (result), (int)log_bytes, (int)compressed_bytes, req_id, message];
        SLSLogV("%@", fail);
    }
}

- (void) initLogProducer {
    // The Simple Log Service endpoint. The endpoint must start with https:// or http://. 
    NSString *endpoint = @"your endpoint";
    NSString *project = @"your project";
    NSString *logstore = @"your logstore";

    _config = [[LogProducerConfig alloc] initWithEndpoint:endpoint
                                                  project:project
                                                 logstore:logstore
    ];

    // The topic of logs. 
    [_config SetTopic:@"example_topic"];
    // The tag, which is added to all logs. 
    [_config AddTag:@"example" value:@"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:1];
    // 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];    

    // Pass callback as the second parameter if you are concerned about whether a log is successfully uploaded. 
    _client = [[LogProducerClient alloc] initWithLogProducerConfig:_config callback:_on_log_send_done];
}

// Query the AccessKey pair. 
- (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. 
    [self updateAccessKey:accessKeyId accessKeySecret:accessKeySecret securityToken:securityToken];
}

// Update the AccessKey pair. 
- (void) updateAccessKey:(NSString *)accessKeyId accessKeySecret:(NSString *)accessKeySecret securityToken:(NSString *)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 (securityToken.length > 0) {
        if (accessKeyId.length > 0 && accessKeySecret.length > 0) {
            [_config ResetSecurityToken:accessKeyId
                        accessKeySecret:accessKeySecret
                          securityToken:securityToken
            ];
        }
    } else {
        // If you obtain an AccessKey pair by using a method other than STS, update the AccessKey pair by using the following method: 
        if (accessKeyId.length > 0 && accessKeySecret.length > 0) {
            [_config setAccessKeyId: accessKeyId];
            [_config setAccessKeySecret: accessKeySecret];
        }
    }
}
// Upload logs. 
- (void) addLog {
    Log *log = [Log log];
    // Adjust the fields that you want to upload based on your business requirements. 
    [log putContent:@"content_key_1" intValue:123456];
    [log putContent:@"content_key_2" floatValue:23.34f];
    [log putContent:@"content_key_3" value:@"Chinese"];
    
    [_client AddLog:log];
}
@end

高度な操作

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

Simple Log Service SDK for iOSを使用して、Endpoint、Project、Logstore、およびAccessKeyパラメーターを動的に設定できます。 詳細については、「エンドポイント」および「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. 
    [_config setProject:@"your new-project"];
    // Update the Logstore. 
    [_config setLogstore:@"your new-logstore"];
  • AccessKeyパラメーターを動的に設定します。

    AccessKeyペアを動的に設定する場合は、コールバック方法も設定することを推奨します。

    // If the callback method is initialized when you initialize the LogProducerClient instance, ignore the following code: 
    static void _on_log_send_done(const char * config_name, log_producer_result result, size_t log_bytes, size_t compressed_bytes, const char * req_id, const char * message, const unsigned char * raw_buffer, void * userparams) {
        if (LOG_PRODUCER_SEND_UNAUTHORIZED == result || LOG_PRODUCER_PARAMETERS_INVALID) {
            [selfClzz requestAccessKey]; // selfClzz specifies the ownership of the current class. 
        }
    }
    
    // Pass callback as the second parameter if you are concerned about whether a log is successfully uploaded. 
    _client = [[LogProducerClient alloc] initWithLogProducerConfig:_config callback:_on_log_send_done];
    
    // Query the AccessKey pair. 
    - (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. 
        [self updateAccessKey:accessKeyId accessKeySecret:accessKeySecret securityToken:securityToken];
    }
    
    // Update the AccessKey pair. 
    - (void) updateAccessKey:(NSString *)accessKeyId accessKeySecret:(NSString *)accessKeySecret securityToken:(NSString *)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 (securityToken.length > 0) {
            if (accessKeyId.length > 0 && accessKeySecret.length > 0) {
                [_config ResetSecurityToken:accessKeyId
                            accessKeySecret:accessKeySecret
                              securityToken:securityToken
                ];
            }
        } else {
            // If you obtain an AccessKey pair by using a method other than STS, update the AccessKey pair by using the following method: 
            if (accessKeyId.length > 0 && accessKeySecret.length > 0) {
                [_config setAccessKeyId: accessKeyId];
                [_config setAccessKeySecret: accessKeySecret];
            }
        }
    }
  • Source、Topic、およびTagパラメーターを動的に設定します。

    重要

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

    // The topic of logs. 
    [_config SetTopic:@"your new-topic"];
    // The source of logs. 
    [_config SetSource:@"your new-source"];
    // The tag, which is added to all logs. 
    [_config AddTag:@"test" value:@"your new-tag"];

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

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

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

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

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

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

- (void) initLogProducer {
    // 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. 
    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *Path = [[paths lastObject] stringByAppendingString:@"/log.dat"];
    [_config SetPersistentFilePath:Path];
    // 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];
}

Parameters

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

パラメーター

Type

説明

SetTopic

String

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

AddTag

String

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

セットソース

String

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

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の式に基づいて計算されます。

SetPersistent

Int

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

  • 1: はい。

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

SetPersistentFilePath

String

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

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

SetPersistentForceFlush

Int

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

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

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

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

SetPersistentMaxFileCount

Int

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

SetPersistentMaxFileSize

Int

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

SetPersistentMaxLogCount

Int

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

SetConnectTimeoutSec

IntInt

ネットワーク接続のタイムアウト期間。 デフォルト値は 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: はい。

エラーコード

すべてのエラーコードはlog_producer_resultで定義されています。 次の表に、エラーコードを示します。

エラーコード

説明

解決策

LOG_PRODUCER_OK

0

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

非該当

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

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

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

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

  • SDKの初期化の複製

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

      // AliyunLogHelper.h
      @interface AliyunLogHelper : NSObject
      + (instancetype)sharedInstance;
      - (void) addLog:(Log *)log;
      @end
      
      
      // AliyunLogHelper.m
      @interface AliyunLogHelper ()
      @property(nonatomic, strong) LogProducerConfig *config;
      @property(nonatomic, strong) LogProducerClient *client;
      @end
      
      @implementation AliyunLogHelper
      
      + (instancetype)sharedInstance {
          static AliyunLogHelper *sharedInstance = nil;
          static dispatch_once_t onceToken;
          dispatch_once(&onceToken, ^{
              sharedInstance = [[self alloc] init];
          });
          return sharedInstance;
      }
      
      - (instancetype)init {
          self = [super init];
          if (self) {
              [self initLogProducer];
          }
          return self;
      }
      
      - (void) initLogProducer {
          // Replace the following code with your code for SDK initialization. 
          _config = [[LogProducerConfig alloc] initWithEndpoint:@""
                                                        project:@""
                                                       logstore:@""
                                                    accessKeyID:@""
                                                accessKeySecret:@""
                                                  securityToken:@""
          ];
      
          _client = [[LogProducerClient alloc] initWithLogProducerConfig:_config callback:_on_log_send_done];
      }
      
      - (void) addLog:(Log *)log {
          if (nil == log) {
              return;
          }
      
          [_client AddLog:log];
      }
      
      @end
    • 複数のプロセスでSDKの初期化が重複することもあります。 メインプロセスでのみSDKを初期化するか、複数のプロセスでSDKを初期化する場合はsetPersistentFilePathパラメーターに異なる値を指定することを推奨します。

  • 悪いネットワーク条件

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

    // Initialize the SDK. 
    - (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

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