tencent cloud

Cloud Log Service

Android/IOS SDKログアップロード

ダウンロード
フォーカスモード
フォントサイズ
最終更新日: 2026-10-12 15:06:43
AI翻訳

SDK概要

Tencent Cloud CLS(Cloud Log Service)モバイルSDKは、AndroidとiOSの2大プラットフォームに対応し、ログ収集、アップロード、ネットワーク検出などのコア機能を提供します。また、端末側の最適化、高い信頼性、アップロード高速化、柔軟な設定などの利点を備え、さまざまなモバイルアプリケーションのログ管理シーンに適用でき、ログデータの安全かつ効率的な転送と保存を実現します。

コア機能

ログアップロードのコア機能

端側最適化:モバイルシーンに適応し、性能とリソースを両立します。
ネイティブ深度適応:Android/iOSネイティブAPIと互換性があり、ネイティブスレッド同期により競合を回避し、ReachabilityライブラリとConnectivityManagerを利用してネットワーク状態をリアルタイムに検知し、モバイル端末の実行環境に正確に適合します。
リソースインテリジェント管理:SQLiteローカルストレージとmaxDatabaseSizeを組み合わせてデータベースサイズを制限し、コアロジックは独立したバックグラウンドスレッドで実行され、UIのブロックを防止します。batchSizeとsendLogIntervalの設定をサポートし、ログをバッチ処理で送信することで、ネットワークオーバーヘッドと電力消費を大幅に削減します。
安全なストレージ規範:アプリケーションサンドボックスのDocumentsディレクトリでのみデータベースを操作し、モバイル端末のデータストレージ標準を厳格に遵守し、データ漏洩と不正アクセスを根本から防止します。
信頼性の確保:全リンクでの保護により、ログの欠落や重複を防止します。
ローカル永続化:ログ生成後、即時にシリアル化してローカルデータベースに保存します。Appがクラッシュした場合やネットワークが切断された場合でも、データは完全に保持され、ネットワーク復旧後に自動的に再送信されます。
多層検証システム:送信前にlogIds、topicId、Protobufシリアル化結果などのデータ整合性を検証し、同時にURLとリクエストボディの正当性を検証して、パラメータエラーによる送信失敗を防ぎます。
インテリジェントリトライメカニズム:エラーコードをきめ細かく処理し、4xxエラーではリトライを即座に終了し、5xxおよび特定の4xxエラーではログを保持してリトライ戦略を動的に調整します。サーバーから200レスポンスを受信した場合にのみローカルログを削除し、データの最終的な整合性を実現します。
アップロード高速化戦略:二段階圧縮により、転送効率を向上させます。
効率的なシリアル化:Google Protocol Buffersを採用してJSON/XMLを置き換えることで、データサイズが小さくなり、解析速度が向上し、転送量とCPU消費を大幅に削減します。
極速圧縮:LZ4アルゴリズムはProtobufシリアル化データを二次圧縮し、CPU負荷をほとんど増加させず、転送payloadサイズをさらに削減し、アップロード速度を最大化します。
弾力的な設定能力:複雑なビジネスシーンに柔軟に適応します。
豊富な設定項目:Android/iOSでendpoint、accessKeyId、accessKeyなどのコア設定、およびsendLogInterval、maxMemorySizeなどの性能パラメータを統一的にカプセル化します。
動的調整:実行時にログ送信間隔やデータベース容量などのパラメータを柔軟に変更でき、再起動せずに有効化され、弱いネットワークや高いリアルタイム性など多様なシーンに適応します。
ライフサイクル管理:updateTokenメソッドを提供し、認証Tokenの動的な更新をサポートし、一時的なセキュリティ認証情報のローテーション要件を満たし、環境適応性が高いです。
エンジニアリング上の利点:安定したアーキテクチャで、安全かつ拡張可能です。
アーキテクチャ設計:シングルトンパターンによりグローバルログ管理インスタンスの一意性を確保し、リソース競合を回避します。モジュール化によりコアコントローラ、データアクセス層などのコンポーネントを分割し、構造が明確で、保守と拡張が容易です。
安全防护:HMACSHA1アルゴリズムがリクエストメソッド、パス、パラメータおよびheadersに署名し、中間者による改ざんとリプレイ攻撃を防御します。鍵はディスクに保存されず、サーバー側の署名検証と連携して、データ転送の安全防衛線を強固にします。
スレッドセーフ:updateToken、setConfigなどのマルチスレッド呼び出しメソッドは、@synchronizedロックによって保護され、マルチスレッド環境下でのデータの一貫性と安定性を確保します。

ネットワーク検出機能

Ping、TCPPing、TraceRoute、HttpPingの4つのプローブ方式に対応し、ネットワーク接続性、遅延、ルーティングなどの情報を取得でき、ログアップロードの障害切り分けに根拠を提供します。

クイックスタート

注意事項

キーセキュリティ:accessKeyIdとaccessKeySecretは適切に保管し、クライアントコードへのハードコーディングを避け、サーバー側から動的に配布することを推奨します。
難読化設定:Androidプラットフォームでは、LZ4圧縮アルゴリズムの難読化免除を追加する必要があります:-keep class net.jpountz.lz4.** { *; }。
デバッグモード:アプリケーションをリリースする際は、SDKのデバッグモードを無効にしてください(iOS:config.debuggable = NO、Android:config.debuggable = false)。これによりログ漏洩を防止します。
ネットワーク対応:Android 9.0以降では、ネットワークセキュリティポリシーを設定し、対応ドメインの平文転送を許可するか、HTTPSを使用する必要があります。iOSでは、ネットワーク権限を有効にし、ATSポリシーに対応する必要があります。
権限制御:Androidでは、ネットワークアクセス、ネットワーク状態照会などの必要な権限を申請する必要があります。iOSでは、Info.plistでネットワーク権限の説明を設定する必要があります(必要な場合)。
キャッシュ管理:データベースとメモリキャッシュの上限を適切に設定し、デバイスのストレージ容量を過度に占有することを避け、異なるデバイス性能に適応します。
バージョン互換性:統合時には、SDKバージョンがプロジェクトの最低サポートシステムバージョンと一致していることを確認し、互換性の問題を回避してください。

iOSプラットフォーム

環境準備

開発ツール:Xcode。
対応バージョン:iOS 9.0以降。
依存関係管理:CocoaPods。

設定パラメータ

パラメータ名
タイプ
説明
デフォルト値
endpoint
String
地域情報です。入力時は、利用可能なリージョンのAPIアップロードログタブに記載されているドメインをご参照ください。
-
accessKeyId(secretId)
String
アクセスキーIDです。このアクセスキーにはSDKログアップロード権限が必要です。
-
accessKeySecret(secretKey)
String
アクセスキーKeyです。SDKログアップロード権限が必要です。
-
topicId
String
ログトピックIDです。コンソールで取得できます。
-
token
String
一時キー(オプション)。
-
sendLogInterval
Int
ログ送信滞留時間、単位:秒。
5
maxMemorySize
Int
メモリキャッシュ上限、単位:バイト。
32MB(3210241024)
batchSize
Int
バッチ処理ログ件数の閾値。
デフォルトではプラットフォームの特性に適応し、カスタマイズ可能です。
maxDatabaseSize
Long
データベース最大サイズ制限、単位:バイト。
デバイスストレージに適応し、カスタマイズ可能です。
debuggable
BOOL
デバッグモードスイッチです。リリース時にはオフにする必要があります。
NO

導入手順

説明:
1. プラグインを統合します。Podfileに対応する依存関係を追加し、pod installを実行して統合を完了します。
コアログアップロード:pod 'TencentCloudLogProducer/Core', '2.0.0'
ネットワークプローブプラグイン:pod 'TencentCloudLogProducer/NetWorkDiagnosis'
2. 設定を初期化します。
2.1 コアログアップロードを初期化します。
Objective-C
Swift
#import "TencentCloudLogProducer/ClsLogSender.h"
#import "TencentCloudLogProducer/CLSLogStorage.h"

// 設定の初期化
ClsLogSenderConfig *config = [ClsLogSenderConfig configWithEndpoint:@"your_endpoint"
accessKeyId:@"your_accessKeyId"
accessKey:@"your_accessKey"];
// オプションパラメータを設定します(例)
config.sendLogInterval = 5; // ログ送信間隔、デフォルト5秒
config.maxMemorySize = 32 * 1024 * 1024; // メモリ上限、デフォルト32MB
config.token = @"your_temp_token"; // 一時キー(オプション)

// SDKを起動します。
_sender = [LogSender sharedSender];
[_sender setConfig:config];
[_sender start];
import TencentCloudLogProducer

// 設定の初期化
let config = ClsLogSenderConfig(
endpoint: "your_endpoint" ?? "",
accessKeyId: "your_accessKeyId" ?? "",
accessKey: "your_accessKey" ?? ""
)
config.sendLogInterval = 5 // ログ送信間隔、デフォルト5秒
config.maxMemorySize = 32 * 1024 * 1024 // メモリ上限、デフォルト32MB
config.token = "your_temp_token" // 一時キー(オプション)

// SDKを起動します。
let sender = LogSender.shared()
sender.setConfig(config)
sender.start()
2.2 ネットワークプローブプラグインを初期化します。
Objective-C
Swift
#import "ClsNetworkDiagnosis.h"
#import "ClsAdapter.h"
#import "ClsNetDiag.h"

// 設定の初期化
ClsConfig *config = [[ClsConfig alloc] init];
config.debuggable = YES; // デバッグモード、リリース時は無効にすることを推奨します。
config.endpoint = @"ap-guangzhou.cls.tencentcs.com";
config.accessKeyId = @"your_accessKeyId";
config.accessKeySecret = @"your_accessKeySecret";
config.topicId = @"your_topicId";
config.pluginAppId = @"your_pluginAppId";

// カスタムパラメータを追加します(オプション)
[config setUserId:@"user1"];
[config setChannel:@"channel1"];
[config setChannelName:@"公式チャネル"];
[config setUserNick:@"テストユーザー"];
[config setLongLoginNick:@"よく使うニックネーム"];
[config setLongLoginUserId:@"long_login_user1"];
[config setLoginType:@"wechat"];
[config addCustomWithKey:@"customKey" andValue:@"testValue"];

// プラグインマネージャーを初期化します。
ClsAdapter *clsAdapter = [ClsAdapter sharedInstance];
[clsAdapter addPlugin:[[CLSNetworkDiagnosisPlugin alloc] init]];
[clsAdapter initWithCLSConfig:config];
import UIKit
import TencentCloudLogProducer

// CLSOutputDelegateプロトコルを実装する出力クラス
class CLSWriter: NSObject, CLSOutputDelegate {
func write(_ line: String!) {
print("CLSWriter output: \\(line ?? "")")
}
}

// 設定を初期化します。
func initNetworkDiagnosis() {
let config = ClsConfig()
config.endpoint = "ap-guangzhou.cls.tencentcs.com"
config.accessKeyId = "your_access_key_id"
config.accessKeySecret = "your_access_key_secret"
config.topicId = "your_topic_id"
config.pluginAppId = "your_plugin_id"

// オプション:カスタムパラメータ
config.userId = "user1"
config.channel = "channel1"
config.addCustom(withKey: "customKey1", andValue: "testValue")

// ネットワークプローブプラグインを追加します。
let clsAdapter = ClsAdapter.sharedInstance()
let plugin = CLSNetworkDiagnosisPlugin()
clsAdapter.add(unsafeBitCast(plugin, to: baseClsPlugin.self))
clsAdapter.initWith(config)
}

3. ログを書き込みます。例は以下の通りです。
Objective-C
Swift
#import "TencentCloudLogProducer/ClsLogSender.h"
#import "TencentCloudLogProducer/CLSLogStorage.h"
#import "TencentCloudLogProducer/ClsLogs.pbobjc.h"

// ログ内容を構築します。
Log_Content *logContent = [Log_Content message];
logContent.key = @"user_behavior";
logContent.value = @"click_submit_button";

// ログ項目を構築します(タイムスタンプは秒単位)。
Log *logItem = [Log message];
[logItem.contentsArray addObject:logContent];
logItem.time = [@(System.currentTimeMillis() / 1000) longLongValue];

// ローカルデータベースに書き込みます(自動的にバッチ処理送信をトリガーします)。
[[CLSLogStorage sharedInstance] writeLog:logItem
topicId:@"your_topicId"
completion:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"ログ書き込み成功、送信待ち");
} else {
NSLog(@"ログ書き込み失敗:%@", error.localizedDescription);
}
}];
import TencentCloudLogProducer

// ログ内容を構築します。
let logContent = Log_Content()
logContent.key = "user_behavior"
logContent.value = "click_submit_button"

// ログ項目を構築します(タイムスタンプは秒単位)。
let logItem = Log()
logItem.contentsArray.add(logContent)
logItem.time = Int64(Date().timeIntervalSince1970)

// ローカルデータベースに書き込みます(自動的にバッチ処理送信をトリガーします)。
ClsLogStorage.sharedInstance().write(logItem, topicId: "your_topicId") { success, error in
if success {
print("ログ書き込み成功、送信待ち")
} else {
print("ログ書き込み失敗:error.debugDescription)")
}
}
4. ネットワーク検出、使用例は以下の通りです。
Pingプローブ。
Objective-C
Swift
// 方法1:基本Pingプローブ。
[[CLSNetworkDiagnosisPlugin sharedInstance] ping:@"cloud.tencent.com"
size:64
output:self
complete:^(BOOL success, NSString *result) {
NSLog(@"Pingプローブ結果:%@", result);
}];

// 方法2:タイムアウト時間とプローブ回数を指定したPingプローブ。
[[CLSNetworkDiagnosisPlugin sharedInstance] ping:@"cloud.tencent.com"
size:64
task_timeout:3000
output:self
complete:^(BOOL success, NSString *result) {
NSLog(@"Pingプローブ結果:%@", result);
} count:10];

// 方法3:カスタムフィールド付きPingプローブ。
NSMutableDictionary *customFields = [NSMutableDictionary dictionary];
customFields[@"detect_scene"] = @"log_upload_failure";
[[CLSNetworkDiagnosisPlugin sharedInstance] ping:@"cloud.tencent.com"
size:64
output:self
complete:^(BOOL success, NSString *result) {
NSLog(@"Pingプローブ結果:%@", result);
} customFiled:customFields];
//方法一:基本Pingプローブ。
ClsNetworkDiagnosis.sharedInstance().ping(
"cloud.tencent.com",
size: 64,
output: CLSWriter()
) { result in
print("Pingプローブ結果:\\(result?.description ?? "結果なし")")
}

// 方法2:タイムアウト時間とプローブ回数を指定したPingプローブ。
ClsNetworkDiagnosis.sharedInstance().ping(
"cloud.tencent.com",
size: 64,
task_timeout: 3000, // タイムアウト時間:3000ミリ秒。
output: CLSWriter(),
complete: { result in
print("Pingプローブ結果:\\(result?.description ?? "結果なし")")
},
count: 10 // プローブ回数。
)

//方法3:カスタムフィールド付きPingプローブ。
let customFields = NSMutableDictionary()
customFields["detect_scene"] = "log_upload_failure"
customFields["app_version"] = "1.0.0"

ClsNetworkDiagnosis.sharedInstance().ping(
"cloud.tencent.com",
size: 64,
output: CLSWriter(),
complete: { result in
print("Pingプローブ結果:\\(result?.description ?? "結果なし")")
},
customFiled: customFields
)

//方法4:完全なパラメータ付きPingプローブ。
let customFields = NSMutableDictionary()
customFields["detect_scene"] = "log_upload_failure"

ClsNetworkDiagnosis.sharedInstance().ping(
"cloud.tencent.com",
size: 64,
task_timeout: 3000,
output: CLSWriter(),
complete: { result in
guard let result = result else {
print("Pingプローブ失敗")
return
}
print("Pingプローブ結果:")
print("- 平均遅延:\\(result.avgRtt ?? "") ms")
print("- パケットロス率:\\(result.loss_rate ?? "") %")
print("- 完全な結果:\\(result.description)")
},
count: 10,
customFiled: customFields
)

TCPPingプローブ。
Objective-C
Swift
// 方法1:基本TCPPingプローブ。
[[CLSNetworkDiagnosisPlugin sharedInstance] tcpPing:@"cloud.tencent.com"
output:self
complete:^(BOOL success, NSString *result) {
NSLog(@"TCPPingプローブ結果:%@", result);
}];

// 方法2:ポート、タイムアウト時間、プローブ回数を指定したTCPPingプローブ。
[[CLSNetworkDiagnosisPlugin sharedInstance] tcpPing:@"cloud.tencent.com"
port:80
task_timeout:3000
count:10
output:self
complete:^(BOOL success, NSString *result) {
NSLog(@"TCPPingプローブ結果:%@", result);
}];

// 方法3:カスタムフィールド付きTCPPingプローブ。
NSMutableDictionary *customFields = [NSMutableDictionary dictionary];
customFields[@"detect_scene"] = @"log_upload_failure";
[[CLSNetworkDiagnosisPlugin sharedInstance] tcpPing:@"cloud.tencent.com"
output:self
complete:^(BOOL success, NSString *result) {
NSLog(@"TCPPingプローブ結果:%@", result);
} customFiled:customFields];
//方法 1:基本TCPPingプローブ。
ClsNetworkDiagnosis.sharedInstance().tcpPing(
"cloud.tencent.com",
output: CLSWriter()
) { result in
print("TCPPingプローブ結果:\\(result?.description ?? "結果なし")")
}

//方法 2:ポート、タイムアウト時間、プローブ回数を指定したTCPPingプローブ。
ClsNetworkDiagnosis.sharedInstance().tcpPing(
"cloud.tencent.com",
port: 80, // ターゲットポート。
task_timeout: 3000, // タイムアウト時間:3000ミリ秒。
count: 10, // プローブ回数。
output: CLSWriter()
) { result in
print("TCPPingプローブ結果:\\(result?.description ?? "結果なし")")
}

//方法 3:カスタムフィールド付きTCPPingプローブ。
let customFields = NSMutableDictionary()
customFields["detect_scene"] = "log_upload_failure"
customFields["connection_type"] = "wifi"

ClsNetworkDiagnosis.sharedInstance().tcpPing(
"cloud.tencent.com",
output: CLSWriter(),
complete: { result in
print("TCPPingプローブ結果:\\(result?.description ?? "結果なし")")
},
customFiled: customFields
)

//方法4:完全なパラメータ付きTCPPingプローブ。
let customFields = NSMutableDictionary()
customFields["detect_scene"] = "log_upload_failure"

ClsNetworkDiagnosis.sharedInstance().tcpPing(
"cloud.tencent.com",
port: 443, // HTTPSポート。
task_timeout: 5000,
count: 10,
output: CLSWriter(),
complete: { result in
guard let result = result else {
print("TCPPingプローブ失敗")
return
}
print("TCPPingプローブ結果:")
print("- 平均遅延:\\(result.avgRtt ?? "") ms")
print("- 成功率:\\(result.success_rate ?? "") %")
print("- 完全な結果:\\(result.description)")
},
customFiled: customFields
)

TraceRouteプローブ。
Objective-C
Swift
// 方法1:基本TraceRouteプローブ。
[[CLSNetworkDiagnosisPlugin sharedInstance] traceRoute:@"cloud.tencent.com"
output:self
complete:^(BOOL success, NSString *result) {
NSLog(@"TraceRouteプローブ結果:%@", result);
}];

// 方法2:最大ホップ数を指定したTraceRouteプローブ。
[[CLSNetworkDiagnosisPlugin sharedInstance] traceRoute:@"cloud.tencent.com"
output:self
complete:^(BOOL success, NSString *result) {
NSLog(@"TraceRouteプローブ結果:%@", result);
} maxTtl:30];

// 方法3:カスタムフィールド付きTraceRouteプローブ。
NSMutableDictionary *customFields = [NSMutableDictionary dictionary];
customFields[@"detect_scene"] = @"log_upload_failure";
[[CLSNetworkDiagnosisPlugin sharedInstance] traceRoute:@"cloud.tencent.com"
output:self
complete:^(BOOL success, NSString *result) {
NSLog(@"TraceRouteプローブ結果:%@", result);
} customFiled:customFields];
// 方法1:基本TraceRouteプローブ。
ClsNetworkDiagnosis.sharedInstance().traceRoute(
"cloud.tencent.com",
output: CLSWriter()
) { result in
print("TraceRouteプローブ結果:\\(result?.content ?? "結果なし")")
}

//方法2:最大ホップ数を指定したTraceRouteプローブ。
ClsNetworkDiagnosis.sharedInstance().traceRoute(
"cloud.tencent.com",
output: CLSWriter(),
complete: { result in
guard let result = result else {
print("TraceRouteプローブ失敗")
return
}
print("TraceRouteプローブ結果:")
print("- ホップ数:\\(result.hop_count ?? 0)")
print("- ルート詳細:\\(result.content ?? "")")
},
maxTtl: 30 // 最大ホップ数。
)

//方法3:カスタムフィールド付きTraceRouteプローブ。
let customFields = NSMutableDictionary()
customFields["detect_scene"] = "log_upload_failure"
customFields["network_carrier"] = "China Mobile"

ClsNetworkDiagnosis.sharedInstance().traceRoute(
"cloud.tencent.com",
output: CLSWriter(),
complete: { result in
print("TraceRouteプローブ結果:\\(result?.content ?? "結果なし")")
},
customFiled: customFields
)
//方法4:完全なパラメータによるTraceRouteプローブ。
let customFields = NSMutableDictionary()
customFields["detect_scene"] = "log_upload_failure"

ClsNetworkDiagnosis.sharedInstance().traceRoute(
"cloud.tencent.com",
output: CLSWriter(),
complete: { result in
guard let result = result else {
print("TraceRouteプローブ失敗")
return
}
print("TraceRouteプローブ結果:")
print("- 完了状態:\\(result.status)")
print("- ホップ数:\\(result.hop_count ?? 0)")
print("- 詳細ルート:")
print(result.content ?? "ルート情報なし")
},
maxTtl: 30,
customFiled: customFields
)


HttpPingプローブ。
Objective-C
Swift
// 方法1:基本HttpPingプローブ。
[[CLSNetworkDiagnosisPlugin sharedInstance] httping:@"https://ap-guangzhou.cls.tencentcs.com/ping"
output:self
complate:^(BOOL success, NSString *result) {
NSLog(@"HttpPingプローブ結果:%@", result);
}];

// 方法2:カスタムフィールド付きHttpPingプローブ。
NSMutableDictionary *customFields = [NSMutableDictionary dictionary];
customFields[@"detect_scene"] = @"log_upload_failure";
[[CLSNetworkDiagnosisPlugin sharedInstance] httping:@"https://ap-guangzhou.cls.tencentcs.com/ping"
output:self
complate:^(BOOL success, NSString *result) {
NSLog(@"HttpPingプローブ結果:%@", result);
} customFiled:customFields];
//方法1:基本プローブ。
ClsNetworkDiagnosis.sharedInstance().httping(
"https://ap-guangzhou.cls.tencentcs.com/ping",
output: CLSWriter()
) { result in
print("HttpPingプローブ結果:\\(result?.description ?? "結果なし")")
}

//方法2:カスタムフィールド付きHttpPingプローブ。
let customFields = NSMutableDictionary()
customFields["detect_scene"] = "log_upload_failure"
customFields["api_endpoint"] = "ap-guangzhou"

ClsNetworkDiagnosis.sharedInstance().httping(
"https://ap-guangzhou.cls.tencentcs.com/ping",
output: CLSWriter(),
complate: { result in
guard let result = result else {
print("HttpPingプローブ失敗")
return
}
print("HttpPingプローブ結果:")
print("- HTTPステータスコード:\\(result.statusCode ?? 0)")
print("- 応答時間:\\(result.responseTime ?? "") ms")
print("- 完全な結果:\\(result.description)")
},
customFiled: customFields
)
iftshi

Androidプラットフォーム

環境準備

開発ツール:Android Studio。
対応バージョン:Android 4.4以降。
ビルドツール:Gradle。

設定パラメータ

パラメータ名
タイプ
説明
デフォルト値
endpoint
String
地域情報です。入力時は、利用可能なリージョンのAPIアップロードログタブに記載されているドメインをご参照ください。
-
accessKeyId(secretId)
String
アクセスキーIDです。このアクセスキーにはSDKログアップロード権限が必要です。
-
accessKeySecret(secretKey)
String
アクセスキーKeyです。SDKログアップロード権限が必要です。
-
topicId
String
ログトピックIDです。コンソールで取得できます。
-
token
String
一時キー(オプション)。
-
lingerMs
Long
バッチ処理の滞留時間、単位:ミリ秒。
2000
TotalSizeInBytes
Long
メモリキャッシュ上限、単位:バイト。
100MB(100*1024*1024)
MaxBatchSize
Long
1バッチあたりのログ最大サイズ、単位:バイト。
512KB(512*1024)
MaxBatchCount
Int
1バッチあたりの最大ログ件数。
4096
MaxSendThreadCount
Long
最大同時送信スレッド数。
50
MaxBlockSec
Int
送信ブロック最大時間、単位:秒。
60
Retries
Int
送信失敗時の再試行回数。
10
BaseRetryBackoffMs
Long
初回再試行バックオフ時間、単位:ミリ秒。
100
MaxRetryBackoffMs
Long
再試行の最大バックオフ時間、単位:ミリ秒。
50000
MaxReservedAttempts
Int
保持される送信試行記録数。
11
debuggable
Boolean
デバッグモードスイッチです。リリース時にはオフにする必要があります。
false

導入手順

説明:
Android SDKのソースコードURL:https://github.com/TencentCloud/tencentcloud-cls-sdk-android。
1. プラグインを統合します。モジュールのbuild.gradleファイルに依存関係を追加します。
コアログアップロード:implementation(group: 'com.tencentcloudapi.cls', name: 'tencentcloud-cls-sdk-android', version: '2.0.3')
ネットワークプローブプラグイン:implementation(group: 'com.tencentcloudapi.cls', name: 'cls-network-diagnosis-reporter-android', version: '2.0.3')
2. 権限の設定。AndroidManifest.xmlに必要な権限を追加します。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
3. ネットワークセキュリティ設定(Android 9.0以降のバージョンで設定が必要です)。
3.1 res/xmlディレクトリにnetwork_security_config.xmlを作成します。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">ap-guangzhou.cls.tencentcs.com</domain>
</domain-config>
</network-security-config>
3.2 AndroidManifest.xmlのapplicationタグに追加します。
android:networkSecurityConfig="@xml/network_security_config"
4. 難読化設定。proguard-rules.proにLZ4圧縮アルゴリズムの難読化免除を追加します。
-keep class net.jpountz.lz4.** { *; }
5. 設定を初期化します。
5.1 コアログアップロードを初期化します。
import com.tencentcloudapi.cls.AsyncProducerClient;
import com.tencentcloudapi.cls.AsyncProducerConfig;
import com.tencentcloudapi.cls.NetworkUtils;

public class MyApplication extends Application {
private AsyncProducerClient client;

@Override
public void onCreate() {
super.onCreate();

String endpoint = "ap-guangzhou.cls.tencentcs.com";
String secretId = "your_accessKeyId";
String secretKey = "your_accessKeySecret";
String topicId = "your_topicId";

// 設定の初期化
AsyncProducerConfig config = new AsyncProducerConfig(endpoint, secretId, secretKey, "", NetworkUtils.getLocalMachineIP());
config.setLingerMs(2000); // バッチ処理の滞留時間、デフォルト2秒
config.setMaxBatchSize(512 * 1024); // 単一バッチのログ最大サイズ、デフォルト512KB
config.setTotalSizeInBytes(100 * 1024 * 1024); // キャッシュ上限、デフォルト100MB
config.setRetries(10); // 再試行回数、デフォルト10回
config.setMaxSendThreadCount(50); // 最大同時実行スレッド数、デフォルト50
config.setMaxBlockSec(60); // 送信ブロックの最大時間、デフォルト60秒

// クライアントインスタンスを構築します。
client = new AsyncProducerClient(config);
}

public AsyncProducerClient getClient() {
return client;
}
}
5.2 ネットワークプローブプラグインを初期化します。
import com.tencentcloudapi.cls.adapter.CLSAdapter;
import com.tencentcloudapi.cls.config.CLSConfig;
import com.tencentcloudapi.cls.plugin.netdiagnosis.CLSNetDiagnosisPlugin;

public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();

// プラグインマネージャーを初期化します。
CLSAdapter adapter = CLSAdapter.getInstance();
adapter.addPlugin(new CLSNetDiagnosisPlugin());

// 設定の初期化
CLSConfig config = new CLSConfig(this);
config.endpoint = "ap-guangzhou.cls.tencentcs.com";
config.accessKeyId = "your_accessKeyId";
config.accessKeySecret = "your_accessKeySecret";
config.pluginAppId = "123456";
config.topicId = "your_topicId";
config.debuggable = true; // リリース時は無効にすることを推奨します。
config.setAppName("your_app_name");
config.setAppVersion("1.0.0");
config.setUserId("user1");
config.setChannel("channel1");
config.setChannelName("公式チャネル");
config.setUserNick("テストユーザー");
config.setLongLoginNick("よく使うニックネーム");
config.setLongLoginUserId("long_login_user1");
config.setLoginType("wechat");
config.addCustomWithKey("customKey", "testValue");

adapter.init(config);
}
}
6. ログを書き込みます。例は以下の通りです。
import com.tencentcloudapi.cls.LogItem;
import com.tencentcloudapi.cls.LogContent;
import java.util.ArrayList;
import java.util.List;

public class LogUploadUtils {
public static void sendLog(AsyncProducerClient client, String topicId) {
// ログ内容リストを構築します。
List<LogContent> logContents = new ArrayList<>();
LogContent content1 = new LogContent();
content1.setKey("__CONTENT__");
content1.setValue("hello world");
LogContent content2 = new LogContent();
content2.setKey("city");
content2.setValue("guangzhou");
LogContent content3 = new LogContent();
content3.setKey("logNo");
content3.setValue("10001");
LogContent content4 = new LogContent();
content4.setKey("__PKG_LOGID__");
content4.setValue(String.valueOf(System.currentTimeMillis()));

logContents.add(content1);
logContents.add(content2);
logContents.add(content3);
logContents.add(content4);

// ログ項目を構築します(タイムスタンプは秒単位)。
LogItem logItem = new LogItem((int) (System.currentTimeMillis() / 1000));
logItem.setContents(logContents);

// ログを一括アップロードします。
List<LogItem> logItems = new ArrayList<>();
logItems.add(logItem);
client.putLogs(topicId, logItems, result -> {
if (result.isSuccess()) {
System.out.println("ログアップロード成功");
} else {
System.out.println("ログアップロード失敗:" + result.getErrorMsg());
}
});
}
}
7. ネットワーク検出、使用例は以下の通りです。
Pingプローブ。
import com.tencentcloudapi.cls.plugin.netdiagnosis.CLSNetDiagnosis;

public class NetworkDetectUtils {
public static void pingDetect() {
// 方法1:基本Pingプローブ。
CLSNetDiagnosis.getInstance().ping("www.tencentcloud.com", new CLSNetDiagnosis.Output() {
@Override
public void write(String line) {
System.out.println(line);
}
}, new CLSNetDiagnosis.Callback() {
@Override
public void onComplete(String result) {
CLSLog.d("PingResult", String.format("ping result: %s", result));
}
});

// 方法2:プローブ回数とパケットサイズを指定したPingプローブ。
CLSNetDiagnosis.getInstance().ping("www.tencentcloud.com", 10, 64, new CLSNetDiagnosis.Output() {
@Override
public void write(String line) {
System.out.println(line);
}
}, new CLSNetDiagnosis.Callback() {
@Override
public void onComplete(String result) {
CLSLog.d("PingResult", String.format("ping result: %s", result));
}
});
}
}
TCPPingプローブ。
import com.tencentcloudapi.cls.plugin.netdiagnosis.CLSNetDiagnosis;

public class NetworkDetectUtils {
public static void tcpPingDetect() {
// 方法1:基本的なTCPPingプローブ。
CLSNetDiagnosis.getInstance().tcpPing("www.tencentcloud.com", 80, new CLSNetDiagnosis.Output() {
@Override
public void write(String line) {
System.out.println(line);
}
}, new CLSNetDiagnosis.Callback() {
@Override
public void onComplete(String result) {
CLSLog.d("TCPPingResult", String.format("tcpPing result: %s", result));
}
});

// 方法2:プローブ回数とタイムアウト時間を指定したTCPPingプローブ。
CLSNetDiagnosis.getInstance().tcpPing("www.tencentcloud.com", 80, 10, 3000, new CLSNetDiagnosis.Output() {
@Override
public void write(String line) {
System.out.println(line);
}
}, new CLSNetDiagnosis.Callback() {
@Override
public void onComplete(String result) {
CLSLog.d("TCPPingResult", String.format("tcpPing result: %s", result));
}
});
}
}
TraceRouteプローブ。
import com.tencentcloudapi.cls.plugin.netdiagnosis.CLSNetDiagnosis;

public class NetworkDetectUtils {
public static void traceRouteDetect() {
// 方法1:基本的なTraceRouteプローブ。
CLSNetDiagnosis.getInstance().traceroute("www.tencentcloud.com", new CLSNetDiagnosis.Output() {
@Override
public void write(String line) {
System.out.println(line);
}
}, new CLSNetDiagnosis.Callback() {
@Override
public void onComplete(String result) {
CLSLog.d("TraceRouteResult", String.format("traceRoute result: %s", result));
}
});

// 方法2:最大ホップ数と各ホップのプローブ回数を指定したTraceRouteプローブ。
CLSNetDiagnosis.getInstance().traceroute("www.tencentcloud.com", 30, 3, new CLSNetDiagnosis.Output() {
@Override
public void write(String line) {
System.out.println(line);
}
}, new CLSNetDiagnosis.Callback() {
@Override
public void onComplete(String result) {
CLSLog.d("TraceRouteResult", String.format("traceRoute result: %s", result));
}
});
}
}
HttpPingプローブ。
import com.tencentcloudapi.cls.plugin.netdiagnosis.CLSNetDiagnosis;

public class NetworkDetectUtils {
public static void httpPingDetect() {
CLSNetDiagnosis.getInstance().httpPing("https://www.tencentcloud.com", new CLSNetDiagnosis.Output() {
@Override
public void write(String line) {
System.out.println(line);
}
}, new CLSNetDiagnosis.Callback() {
@Override
public void onComplete(String result) {
CLSLog.d("HttpPingResult", String.format("httpPing result: %s", result));
}
});
}
}


ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック