-keep class net.jpountz.lz4.** { *; }.config.debuggable = NO; Android: config.debuggable = false) in release builds to prevent log leakage.Parameter Name | Type | Description | Default Value |
endpoint | String | Region information. For the domain name to use, refer to the API Log Upload tab in Available Regions. | - |
accessKeyId (secretId) | String | - | |
accessKeySecret (secretKey) | String | - | |
topicId | String | - | |
token | String | Temporary key (optional). | - |
sendLogInterval | Int | Delay before sending logs (in seconds). | 5 |
maxMemorySize | Int | Upper limit for in-memory cache (in bytes). | 32MB (3210241024) |
batchSize | Int | Threshold for batch processing log entries. | Adapts to platform characteristics by default. Customizable. |
maxDatabaseSize | Long | Maximum database size limit (in bytes). | Adapts to device storage. Customizable. |
debuggable | BOOL | Debug mode switch. It must be disabled for release builds. | NO |
pod 'TencentCloudLogProducer/Core', '2.0.0'.pod 'TencentCloudLogProducer/NetWorkDiagnosis'.#import "TencentCloudLogProducer/ClsLogSender.h"#import "TencentCloudLogProducer/CLSLogStorage.h"// Initialize the configuration.ClsLogSenderConfig *config = [ClsLogSenderConfig configWithEndpoint:@"your_endpoint"accessKeyId:@"your_accessKeyId"accessKey:@"your_accessKey"];// Set optional parameters (example).config.sendLogInterval = 5; // Delay before sending logs. Default value: 5 seconds.config.maxMemorySize = 32 * 1024 * 1024; // Upper limit for in-memory cache. Default value: 32MB.config.token = @"your_temp_token"; // Temporary key (optional).// Start the SDK._sender = [LogSender sharedSender];[_sender setConfig:config];[_sender start];
import TencentCloudLogProducer// Initialize the configuration.let config = ClsLogSenderConfig(endpoint: "your_endpoint" ?? "",accessKeyId: "your_accessKeyId" ?? "",accessKey: "your_accessKey" ?? "")config.sendLogInterval = 5 // Delay before sending logs. Default value: 5 seconds.config.maxMemorySize = 32 * 1024 * 1024 // Upper limit for in-memory cache. Default value: 32MB.config.token = "your_temp_token" // Temporary key (optional).// Start the SDK.let sender = LogSender.shared()sender.setConfig(config)sender.start()
#import "ClsNetworkDiagnosis.h"#import "ClsAdapter.h"#import "ClsNetDiag.h"// Initialize the configuration.ClsConfig *config = [[ClsConfig alloc] init];config.debuggable = YES; // Debug mode. It should be disabled for release builds.config.endpoint = @"ap-guangzhou.cls.tencentcs.com";config.accessKeyId = @"your_accessKeyId";config.accessKeySecret = @"your_accessKeySecret";config.topicId = @"your_topicId";config.pluginAppId = @"your_pluginAppId";// Add custom parameters (optional).[config setUserId:@"user1"];[config setChannel:@"channel1"];[config setChannelName:@"Official channel"];[config setUserNick:@"Test user"];[config setLongLoginNick:@"Frequently used nickname"];[config setLongLoginUserId:@"long_login_user1"];[config setLoginType:@"wechat"];[config addCustomWithKey:@"customKey" andValue:@"testValue"];// Initialize the plugin manager.ClsAdapter *clsAdapter = [ClsAdapter sharedInstance];[clsAdapter addPlugin:[[CLSNetworkDiagnosisPlugin alloc] init]];[clsAdapter initWithCLSConfig:config];
import UIKitimport TencentCloudLogProducer// Output class that implements the CLSOutputDelegate protocol.class CLSWriter: NSObject, CLSOutputDelegate {func write(_ line: String!) {print("CLSWriter output: \\(line ?? "")")}}// Initialize the configuration.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"// Optional: Custom parameters.config.userId = "user1"config.channel = "channel1"config.addCustom(withKey: "customKey1", andValue: "testValue")// Add the network detection plugin.let clsAdapter = ClsAdapter.sharedInstance()let plugin = CLSNetworkDiagnosisPlugin()clsAdapter.add(unsafeBitCast(plugin, to: baseClsPlugin.self))clsAdapter.initWith(config)}
#import "TencentCloudLogProducer/ClsLogSender.h"#import "TencentCloudLogProducer/CLSLogStorage.h"#import "TencentCloudLogProducer/ClsLogs.pbobjc.h"// Build log content.Log_Content *logContent = [Log_Content message];logContent.key = @"user_behavior";logContent.value = @"click_submit_button";// Build a log item (timestamp in seconds).Log *logItem = [Log message];[logItem.contentsArray addObject:logContent];logItem.time = [@(System.currentTimeMillis() / 1000) longLongValue];// Write to the local database (auto-triggers batched sending).[[CLSLogStorage sharedInstance] writeLog:logItemtopicId:@"your_topicId"completion:^(BOOL success, NSError *error) {if (success) {NSLog(@"Log writing successful, to be sent.");} else {NSLog(@"Log writing failed: %@", error.localizedDescription);}}];
import TencentCloudLogProducer// Build log content.let logContent = Log_Content()logContent.key = "user_behavior"logContent.value = "click_submit_button"// Build a log item (timestamp in seconds).let logItem = Log()logItem.contentsArray.add(logContent)logItem.time = Int64(Date().timeIntervalSince1970)// Write to the local database (auto-triggers batched sending).ClsLogStorage.sharedInstance().write(logItem, topicId: "your_topicId") { success, error inif success {print("Log writing successful, to be sent.")} else {print("Log writing failed: error.debugDescription)")}}
// Method 1: Basic Ping detection.[[CLSNetworkDiagnosisPlugin sharedInstance] ping:@"cloud.tencent.com"size:64output:selfcomplete:^(BOOL success, NSString *result) {NSLog(@"Ping detection result: %@", result);}];// Method 2: Ping detection with specified timeout and detection count.[[CLSNetworkDiagnosisPlugin sharedInstance] ping:@"cloud.tencent.com"size:64task_timeout:3000output:selfcomplete:^(BOOL success, NSString *result) {NSLog(@"Ping detection result: %@", result);} count:10];// Method 3: Ping detection with a custom field.NSMutableDictionary *customFields = [NSMutableDictionary dictionary];customFields[@"detect_scene"] = @"log_upload_failure";[[CLSNetworkDiagnosisPlugin sharedInstance] ping:@"cloud.tencent.com"size:64output:selfcomplete:^(BOOL success, NSString *result) {NSLog(@"Ping detection result: %@", result);} customFiled:customFields];
//Method 1: Basic Ping detection.ClsNetworkDiagnosis.sharedInstance().ping("cloud.tencent.com",size: 64,output: CLSWriter()) { result inprint("Ping detection result: \\(result?.description ?? "No result")")}// Method 2: Ping detection with specified timeout and detection count.ClsNetworkDiagnosis.sharedInstance().ping("cloud.tencent.com",size: 64,task_timeout: 3000, // Timeout: 3000 milliseconds.output: CLSWriter(),complete: { result inprint("Ping detection result: \\(result?.description ?? "No result")")},count: 10 // Detection count.)//Method 3: Ping detection with custom fields.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 inprint("Ping detection result: \\(result?.description ?? "No result")")},customFiled: customFields)//Method 4: Ping detection with all parameters.let customFields = NSMutableDictionary()customFields["detect_scene"] = "log_upload_failure"ClsNetworkDiagnosis.sharedInstance().ping("cloud.tencent.com",size: 64,task_timeout: 3000,output: CLSWriter(),complete: { result inguard let result = result else {print("Ping detection failed.")return}print("Ping detection result:")print("- Average latency: \\(result.avgRtt ?? "") ms")print("- Packet loss rate: \\(result.loss_rate ?? "") %")print("- Full result: \\(result.description)")},count: 10,customFiled: customFields)
// Method 1: Basic TCPPing detection.[[CLSNetworkDiagnosisPlugin sharedInstance] tcpPing:@"cloud.tencent.com"output:selfcomplete:^(BOOL success, NSString *result) {NSLog(@"TCPPing detection result: %@", result);}];// Method 2: TCPPing detection with specified port, timeout, and detection count.[[CLSNetworkDiagnosisPlugin sharedInstance] tcpPing:@"cloud.tencent.com"port:80task_timeout:3000count:10output:selfcomplete:^(BOOL success, NSString *result) {NSLog(@"TCPPing detection result: %@", result);}];// Method 3: TCPPing detection with a custom field.NSMutableDictionary *customFields = [NSMutableDictionary dictionary];customFields[@"detect_scene"] = @"log_upload_failure";[[CLSNetworkDiagnosisPlugin sharedInstance] tcpPing:@"cloud.tencent.com"output:selfcomplete:^(BOOL success, NSString *result) {NSLog(@"TCPPing detection result: %@", result);} customFiled:customFields];
//Method 1: Basic TCPPing detection.ClsNetworkDiagnosis.sharedInstance().tcpPing("cloud.tencent.com",output: CLSWriter()) { result inprint("TCPPing detection result: \\(result?.description ?? "No result")")}//Method 2: TCPPing detection with specified port, timeout, and detection count.ClsNetworkDiagnosis.sharedInstance().tcpPing("cloud.tencent.com",port: 80, // Target port.task_timeout: 3000, // Timeout: 3000 milliseconds.count: 10, // Detection count.output: CLSWriter()) { result inprint("TCPPing detection result: \\(result?.description ?? "No result")")}//Method 3: TCPPing detection with custom fields.let customFields = NSMutableDictionary()customFields["detect_scene"] = "log_upload_failure"customFields["connection_type"] = "wifi"ClsNetworkDiagnosis.sharedInstance().tcpPing("cloud.tencent.com",output: CLSWriter(),complete: { result inprint("TCPPing detection result: \\(result?.description ?? "No result")")},customFiled: customFields)//Method 4: TCPPing detection with all parameters.let customFields = NSMutableDictionary()customFields["detect_scene"] = "log_upload_failure"ClsNetworkDiagnosis.sharedInstance().tcpPing("cloud.tencent.com",port: 443, // HTTPS port.task_timeout: 5000,count: 10,output: CLSWriter(),complete: { result inguard let result = result else {print("TCPPing detection failed.")return}print("TCPPing detection result:")print("- Average latency: \\(result.avgRtt ?? "") ms")print("- Success rate: \\(result.success_rate ?? "") %")print("- Full result: \\(result.description)")},customFiled: customFields)
// Method 1: Basic TraceRoute detection.[[CLSNetworkDiagnosisPlugin sharedInstance] traceRoute:@"cloud.tencent.com"output:selfcomplete:^(BOOL success, NSString *result) {NSLog(@"TraceRoute detection result: %@", result);}];// Method 2: TraceRoute detection with specified maximum hops.[[CLSNetworkDiagnosisPlugin sharedInstance] traceRoute:@"cloud.tencent.com"output:selfcomplete:^(BOOL success, NSString *result) {NSLog(@"TraceRoute detection result: %@", result);} maxTtl:30];// Method 3: TraceRoute detection with a custom field.NSMutableDictionary *customFields = [NSMutableDictionary dictionary];customFields[@"detect_scene"] = @"log_upload_failure";[[CLSNetworkDiagnosisPlugin sharedInstance] traceRoute:@"cloud.tencent.com"output:selfcomplete:^(BOOL success, NSString *result) {NSLog(@"TraceRoute detection result: %@", result);} customFiled:customFields];
// Method 1: Basic TraceRoute detection.ClsNetworkDiagnosis.sharedInstance().traceRoute("cloud.tencent.com",output: CLSWriter()) { result inprint("TraceRoute detection result: \\(result?.content ?? "No result")")}//Method 2: TraceRoute detection with specified maximum hops.ClsNetworkDiagnosis.sharedInstance().traceRoute("cloud.tencent.com",output: CLSWriter(),complete: { result inguard let result = result else {print("TraceRoute detection failed.")return}print("TraceRoute detection result:")print("- Hop count: \\(result.hop_count ?? 0)")print("- Route details: \\(result.content ?? "")")},maxTtl: 30 // Maximum hop count.)//Method 3: TraceRoute detection with custom fields.let customFields = NSMutableDictionary()customFields["detect_scene"] = "log_upload_failure"customFields["network_carrier"] = "China Mobile"ClsNetworkDiagnosis.sharedInstance().traceRoute("cloud.tencent.com",output: CLSWriter(),complete: { result inprint("TraceRoute detection result: \\(result?.content ?? "No result")")},customFiled: customFields)//Method 4: TraceRoute detection with all parameters.let customFields = NSMutableDictionary()customFields["detect_scene"] = "log_upload_failure"ClsNetworkDiagnosis.sharedInstance().traceRoute("cloud.tencent.com",output: CLSWriter(),complete: { result inguard let result = result else {print("TraceRoute detection failed.")return}print("TraceRoute detection result:")print("- Completion status: \\(result.status)")print("- Hop count: \\(result.hop_count ?? 0)")print("- Detailed route:")print(result.content ?? "No route information")},maxTtl: 30,customFiled: customFields)
// Method 1: Basic HttpPing detection.[[CLSNetworkDiagnosisPlugin sharedInstance] httping:@"https://ap-guangzhou.cls.tencentcs.com/ping"output:selfcomplate:^(BOOL success, NSString *result) {NSLog(@"HttpPing detection result: %@", result);}];// Method 2: HttpPing detection with a custom field.NSMutableDictionary *customFields = [NSMutableDictionary dictionary];customFields[@"detect_scene"] = @"log_upload_failure";[[CLSNetworkDiagnosisPlugin sharedInstance] httping:@"https://ap-guangzhou.cls.tencentcs.com/ping"output:selfcomplate:^(BOOL success, NSString *result) {NSLog(@"HttpPing detection result: %@", result);} customFiled:customFields];
//Method 1: Basic HttpPing detection.ClsNetworkDiagnosis.sharedInstance().httping("https://ap-guangzhou.cls.tencentcs.com/ping",output: CLSWriter()) { result inprint("HttpPing detection result: \\(result?.description ?? "No result")")}//Method 2: HttpPing detection with custom fields.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 inguard let result = result else {print("HttpPing detection failed.")return}print("HttpPing detection result:")print("- HTTP status code: \\(result.statusCode ?? 0)")print("- Response time: \\(result.responseTime ?? "") ms")print("- Full result: \\(result.description)")},customFiled: customFields)iftshi
Parameter Name | Type | Description | Default Value |
endpoint | String | Region information. For the domain name to use, refer to the API Log Upload tab in Available Regions. | - |
accessKeyId (secretId) | String | - | |
accessKeySecret (secretKey) | String | - | |
topicId | String | - | |
token | String | Temporary key (optional). | - |
lingerMs | Long | Delay for batch processing (in milliseconds). | 2000 |
TotalSizeInBytes | Long | Upper limit for in-memory cache (in bytes). | 100MB (100*1024*1024) |
MaxBatchSize | Long | Maximum size of a single log batch (in bytes). | 512KB (512*1024) |
MaxBatchCount | Int | Maximum number of log entries in a single batch. | 4096 |
MaxSendThreadCount | Long | Maximum number of concurrent sending threads. | 50 |
MaxBlockSec | Int | Maximum blocking time for sending (in seconds). | 60 |
Retries | Int | Number of retry attempts after a sending failure. | 10 |
BaseRetryBackoffMs | Long | Initial backoff interval for retries (in milliseconds). | 100 |
MaxRetryBackoffMs | Long | Maximum backoff interval for retries (in milliseconds). | 50000 |
MaxReservedAttempts | Int | Number of reserved sending attempt records. | 11 |
debuggable | Boolean | Debug mode switch. It must be disabled for release builds. | false |
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').<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" />
<?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>
android:networkSecurityConfig="@xml/network_security_config"
-keep class net.jpountz.lz4.** { *; }
import com.tencentcloudapi.cls.AsyncProducerClient;import com.tencentcloudapi.cls.AsyncProducerConfig;import com.tencentcloudapi.cls.NetworkUtils;public class MyApplication extends Application {private AsyncProducerClient client;@Overridepublic void onCreate() {super.onCreate();String endpoint = "ap-guangzhou.cls.tencentcs.com";String secretId = "your_accessKeyId";String secretKey = "your_accessKeySecret";String topicId = "your_topicId";// Initialize the configuration.AsyncProducerConfig config = new AsyncProducerConfig(endpoint, secretId, secretKey, "", NetworkUtils.getLocalMachineIP());config.setLingerMs(2000); // Delay for batch processing. Default value: 2 seconds.config.setMaxBatchSize(512 * 1024); // Maximum size of a single log batch. Default value: 512KB.config.setTotalSizeInBytes(100 * 1024 * 1024); // Cache upper limit. Default value: 100MB.config.setRetries(10); // Number of retry attempts. Default value: 10.config.setMaxSendThreadCount(50); // Maximum number of concurrent threads. Default value: 50.config.setMaxBlockSec(60); // Maximum blocking time for sending. Default value: 60 seconds.// Build the client instance.client = new AsyncProducerClient(config);}public AsyncProducerClient getClient() {return client;}}
import com.tencentcloudapi.cls.adapter.CLSAdapter;import com.tencentcloudapi.cls.config.CLSConfig;import com.tencentcloudapi.cls.plugin.netdiagnosis.CLSNetDiagnosisPlugin;public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// Initialize the plugin manager.CLSAdapter adapter = CLSAdapter.getInstance();adapter.addPlugin(new CLSNetDiagnosisPlugin());// Initialize the configuration.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; // It should be disabled for release builds.config.setAppName("your_app_name");config.setAppVersion("1.0.0");config.setUserId("user1");config.setChannel("channel1");config.setChannelName("Official channel");config.setUserNick("Test user");config.setLongLoginNick("Frequently used nickname");config.setLongLoginUserId("long_login_user1");config.setLoginType("wechat");config.addCustomWithKey("customKey", "testValue");adapter.init(config);}}
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) {// Build a list of log contents.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);// Build a log item (timestamp in seconds).LogItem logItem = new LogItem((int) (System.currentTimeMillis() / 1000));logItem.setContents(logContents);// Upload logs in batches.List<LogItem> logItems = new ArrayList<>();logItems.add(logItem);client.putLogs(topicId, logItems, result -> {if (result.isSuccess()) {System.out.println("Log upload successful.");} else {System.out.println("Log upload failed: " + result.getErrorMsg());}});}}
import com.tencentcloudapi.cls.plugin.netdiagnosis.CLSNetDiagnosis;public class NetworkDetectUtils {public static void pingDetect() {// Method 1: Basic Ping detection.CLSNetDiagnosis.getInstance().ping("www.tencentcloud.com", new CLSNetDiagnosis.Output() {@Overridepublic void write(String line) {System.out.println(line);}}, new CLSNetDiagnosis.Callback() {@Overridepublic void onComplete(String result) {CLSLog.d("PingResult", String.format("ping result: %s", result));}});// Method 2: Ping detection with specified detection count and package size.CLSNetDiagnosis.getInstance().ping("www.tencentcloud.com", 10, 64, new CLSNetDiagnosis.Output() {@Overridepublic void write(String line) {System.out.println(line);}}, new CLSNetDiagnosis.Callback() {@Overridepublic void onComplete(String result) {CLSLog.d("PingResult", String.format("ping result: %s", result));}});}}
import com.tencentcloudapi.cls.plugin.netdiagnosis.CLSNetDiagnosis;public class NetworkDetectUtils {public static void tcpPingDetect() {// Method 1: Basic TCPPing detection.CLSNetDiagnosis.getInstance().tcpPing("www.tencentcloud.com", 80, new CLSNetDiagnosis.Output() {@Overridepublic void write(String line) {System.out.println(line);}}, new CLSNetDiagnosis.Callback() {@Overridepublic void onComplete(String result) {CLSLog.d("TCPPingResult", String.format("tcpPing result: %s", result));}});// Method 2: TCPPing detection with specified detection count and timeout.CLSNetDiagnosis.getInstance().tcpPing("www.tencentcloud.com", 80, 10, 3000, new CLSNetDiagnosis.Output() {@Overridepublic void write(String line) {System.out.println(line);}}, new CLSNetDiagnosis.Callback() {@Overridepublic void onComplete(String result) {CLSLog.d("TCPPingResult", String.format("tcpPing result: %s", result));}});}}
import com.tencentcloudapi.cls.plugin.netdiagnosis.CLSNetDiagnosis;public class NetworkDetectUtils {public static void traceRouteDetect() {// Method 1: Basic TraceRoute detection.CLSNetDiagnosis.getInstance().traceroute("www.tencentcloud.com", new CLSNetDiagnosis.Output() {@Overridepublic void write(String line) {System.out.println(line);}}, new CLSNetDiagnosis.Callback() {@Overridepublic void onComplete(String result) {CLSLog.d("TraceRouteResult", String.format("traceRoute result: %s", result));}});// Method 2: TraceRoute detection with specified maximum hops and detections per hop.CLSNetDiagnosis.getInstance().traceroute("www.tencentcloud.com", 30, 3, new CLSNetDiagnosis.Output() {@Overridepublic void write(String line) {System.out.println(line);}}, new CLSNetDiagnosis.Callback() {@Overridepublic void onComplete(String result) {CLSLog.d("TraceRouteResult", String.format("traceRoute result: %s", result));}});}}
import com.tencentcloudapi.cls.plugin.netdiagnosis.CLSNetDiagnosis;public class NetworkDetectUtils {public static void httpPingDetect() {CLSNetDiagnosis.getInstance().httpPing("https://www.tencentcloud.com", new CLSNetDiagnosis.Output() {@Overridepublic void write(String line) {System.out.println(line);}}, new CLSNetDiagnosis.Callback() {@Overridepublic void onComplete(String result) {CLSLog.d("HttpPingResult", String.format("httpPing result: %s", result));}});}}
Feedback