Kumpulkan dan kirim log dari aplikasi Flutter ke Simple Log Service (SLS) menggunakan SLS Flutter SDK. SDK ini mendukung Android 4.0 atau versi lebih baru serta iOS 10.0 atau versi lebih baru, dengan fitur-fitur seperti resumable upload, konfigurasi dinamis, dan callback log.
Catatan rilis
SLS Flutter SDK dipublikasikan di repositori paket Dart resmi. Untuk informasi selengkapnya, lihat Aliyun Log Flutter Release.
Kode contoh
Untuk contoh lengkap yang berfungsi, lihat Aliyun Log Flutter SDK Example.
Prasyarat
Instal lingkungan pengembangan Flutter.
SLS Flutter SDK mendukung Android 4.0 atau versi lebih baru serta iOS 10.0 atau versi lebih baru.
Untuk build iOS, Anda harus menambahkan baris berikut ke Podfile Anda:
source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/aliyun-sls/Specs.git' # Jika Anda menggunakan repositori di wilayah Tiongkok Daratan, Anda juga harus menambahkan baris ini. source 'https://gitee.com/aliyun-sls/Specs.git'
Prosedur
Langkah 1: Instal SDK
Tambahkan modul SLS Flutter SDK. Dari direktori root proyek Anda, jalankan perintah berikut:
flutter pub add aliyun_log_dart_sdkSetelah proses selesai, informasi berikut secara otomatis ditambahkan ke file
pubspec.yamlproyek, dan perintahflutter pub getdijalankan secara implisit.dependencies: aliyun_log_dart_sdk: ^1.0.0 // Untuk informasi versi lainnya, lihat ikhtisar SDK Flutter.Impor paket tersebut di file Dart Anda.
import 'package:aliyun_log_dart_sdk/aliyun_log_dart_sdk.dart';
Langkah 2: Inisialisasi SDK
Kode berikut menunjukkan inisialisasi dasar. Untuk opsi konfigurasi lanjutan seperti ukuran paket log dan resumable upload, lihat Parameter konfigurasi.
import 'package:aliyun_log_dart_sdk/aliyun_log_dart_sdk.dart';
AliyunLogDartSdk? _aliyunLogSdk;
void _initProducer() async {
// Tetapkan endpoint, nama project, dan nama Logstore.
LogProducerConfiguration configuration = LogProducerConfiguration(
endpoint: 'your endpoint', project: 'your project', logstore: 'your logstore'
);
// AccessKey Alibaba Cloud. Menggunakan pasangan AccessKey berisiko karena memberikan akses penuh ke resource Anda. Kami sangat menyarankan untuk menggunakan RAM User dalam pemanggilan API.
configuration.accessKeyId = 'your access key id';
configuration.accessKeySecret = 'your access key secret';
configuration.securityToken = 'your access key token'; // Hanya diperlukan saat menggunakan AccessKey temporary dari Security Token Service (STS).
_aliyunLogSdk = AliyunLogDartSdk();
LogProducerResult result = await _aliyunLogSdk!.initProducer(configuration);
}Langkah 3: Kirim log
Panggil metode addLog untuk mengirim log bisnis kustom:
LogProducerResult code = await _aliyunLogSdk!.addLog({
'str': 'str value',
'int': 12,
'double': 12.12,
'boolean': true,
'map': {'key': 'value', 'inntt': 3333},
'array': ['a1', 'a2'],
'null': null,
'content': 'Chinese content'
});Log berhasil dikirim hanya jika code == LogProducerResult.ok. Jika tidak, kode kesalahan akan dikembalikan. Untuk informasi selengkapnya, lihat Kode kesalahan.
Langkah 4: Konfigurasi aturan obfuscation (Android)
Jika proyek Flutter Anda memiliki aturan obfuscation yang diaktifkan (aturan ini diaktifkan secara default pada Flutter v1.16.2 dan versi lebih baru), Anda juga perlu menambahkan aturan berikut ke file konfigurasi obfuscation proyek Anda. Jika tidak, proyek Android mungkin tidak berjalan dengan benar. Proyek iOS tidak terpengaruh oleh aturan ini.
-keep class com.aliyun.sls.android.producer.* { *; }
-keep interface com.aliyun.sls.android.producer.* { *; }Konfigurasi dinamis
Parameter berikut dapat diperbarui saat runtime: Endpoint, Project, Logstore, dan AccessKey.
Perbarui Endpoint, Project, dan Logstore.
await _aliyunLogSdk!.setEndpoint('new-endpoint'); await _aliyunLogSdk!.setProject('new-project-name'); await _aliyunLogSdk!.setLogstore('new-logstore-name');Perbarui AccessKey.
// securityToken bersifat opsional. Hanya diperlukan saat AccessKey diperoleh melalui Security Token Service (STS). await _aliyunLogSdk!.setAccessKey('your accesskey id', 'your accesskey secret', securityToken: 'your accesskey token');Perbarui parameter source, topic, dan tag.
await _aliyunLogSdk!.setSource('flutter'); await _aliyunLogSdk!.setTopic('flutter-test'); await _aliyunLogSdk!.addTag('tag1', 'value1'); await _aliyunLogSdk!.addTag('tag2', 'value2');Perbarui parameter lainnya.
PentingAliyunLogDartSdk.updateConfiguration()tidak mendukung pembaruan parameter resumable upload saat runtime.LogProducerConfiguration configuration = LogProducerConfiguration(); configuration.dropDelayLog = true; configuration.dropUnauthorizedLog = true; // Parameter lain dari kelas LogProducerConfiguration juga dapat diatur dengan cara ini. await _aliyunLogSdk!.updateConfiguration(configuration);
Tetapkan callback log
Tetapkan callback untuk operasi pengiriman log. Callback ini dipicu baik saat sukses maupun gagal, memungkinkan pemantauan status SDK dan pembaruan konfigurasi.
_aliyunLogSdk!.setLogCallback((resultCode, errorMessage, logBytes, compressedBytes) {
// Parameter tidak valid. Anda perlu memperbarui konfigurasi.
if (LogProducerResult.parametersInvalid == resultCode) {
// Misalnya, perbarui Endpoint.
_aliyunLogSdk!.setEndpoint('your endpoint');
// AccessKey yang hilang atau salah juga memicu parametersInvalid.
_aliyunLogSdk!.setAccessKey('your access key id', 'your access key secret', securityToken: 'your token');
}
// Otorisasi telah kedaluwarsa. Anda perlu memperbarui AccessKey.
if (LogProducerResult.sendUnauthorized == resultCode) {
_aliyunLogSdk!.setAccessKey('your access key id', 'your access key secret', securityToken: 'your token');
}
});Mengaktifkan unggah yang dapat dilanjutkan
Untuk mengaktifkan fitur resumable upload, Anda harus mengaktifkannya saat menginisialisasi AliyunLogDartSdk. Anda tidak dapat mengubah konfigurasi resumable upload secara dinamis setelah SDK diinisialisasi.
Konfigurasikan resumable upload selama inisialisasi:
configuration.persistent = true; // Aktifkan resumable upload.
configuration.persistentFilePath = 'flutter/demo'; // Direktori untuk menyimpan cache binlog.
configuration.persistentForceFlush = false; // Nonaktifkan force flush. Biarkan dinonaktifkan karena mengaktifkannya dapat memengaruhi performa.
configuration.persistentMaxFileCount = 10; // Jumlah maksimum file cache. Default: 10.
configuration.persistentMaxFileSize = 1024 * 1024; // Ukuran maksimum satu file cache, dalam byte. Default: 1024 * 1024.
configuration.persistentMaxLogCount = 64 * 1024; // Jumlah maksimum log yang dicache. Default: 64 * 1024.
_aliyunLogSdk = AliyunLogDartSdk();
LogProducerResult result = await _aliyunLogSdk!.initProducer(configuration);Parameter
Parameter yang didukung oleh kelas LogProducerConfiguration tercantum dalam tabel berikut.
Parameter | Tipe | Deskripsi |
endpoint | string | Endpoint wilayah tempat project berada. Contoh: |
project | string | Nama Project. Untuk informasi selengkapnya, lihat Project. |
logstore | string | Nama Logstore. Untuk informasi selengkapnya, lihat Logstore. |
accessKeyId | string | ID AccessKey Anda. Untuk informasi selengkapnya, lihat Pasangan Kunci Akses. |
accessKeySecret | string | Rahasia AccessKey Anda. Untuk informasi selengkapnya, lihat Pasangan Kunci Akses. |
securityToken | string | Token keamanan yang diperlukan untuk autentikasi Security Token Service (STS). Untuk informasi selengkapnya, lihat AssumeRole. |
debuggable | bool | Menentukan apakah Debug Mode diaktifkan. Default: false. Aktifkan mode ini saat melakukan troubleshooting masalah pengumpulan log. |
maxBufferLimit | int | Memori maksimum yang dapat digunakan SDK untuk caching. Satuan: byte. Default: 64 * 1024 * 1024. |
connectTimeout | int | Waktu timeout koneksi jaringan, dalam detik. Default: 10. Jangan ubah nilai ini kecuali diperlukan. |
sendTimeout | int | Waktu timeout pengiriman data, dalam detik. Default: 15. Jangan ubah nilai ini kecuali diperlukan. |
ntpTimeOffset | int | Selisih antara waktu perangkat dan waktu standar, dalam detik. Default: 0. Jangan ubah nilai ini kecuali diperlukan, karena SDK secara otomatis mengoreksi waktu. |
maxLogDelayTime | int | Selisih waktu maksimum yang diizinkan antara timestamp log dan waktu lokal perangkat. Satuan: detik. Default: 7 * 24 * 3600. Jika nilai ini terlampaui, log diproses berdasarkan parameter dropDelayLog. Jangan ubah nilai ini kecuali diperlukan. |
dropDelayLog | bool | Menentukan kebijakan penanganan log yang melebihi maxLogDelayTime. Nilai default adalah false, artinya log tidak dibuang. Bidang diatur ulang ke waktu saat ini. |
dropUnauthorizedLog | bool | Menentukan apakah log yang gagal autentikasi akan dibuang. Default: false. |
source | string |
Bidang yang menunjukkan sumber log. Nilai default: Android atau iOS. |
topic | string |
, yang menunjukkan Topik Log. Tidak ada nilai default. |
Tags (melalui metode addTag()) | string |
Nilai bidang, yaitu metadata tag. Bidang ini tidak memiliki nilai default. Anda harus mengatur nilai ini dengan memanggil metode metode. |
packetLogBytes | int | Ukuran setiap paket log yang akan dikirim. Nilai valid: 1 hingga 5.242.880. Satuan: byte. Default: 1024 * 1024. |
packetLogCount | int | Jumlah maksimum log dalam setiap paket. Nilai valid: 1 hingga 4.096. Default: 1.024. |
packetTimeout | int | Waktu timeout paket log. Jika timeout tercapai, paket langsung dikirim. Satuan: milidetik. Default: 3000. |
persistent | boolean | Menentukan apakah fitur resumable upload diaktifkan. Default: false. Aktifkan fitur ini untuk mencegah kehilangan data. |
persistentForceFlush | boolean | Menentukan apakah cache harus dipaksa flush setiap kali addLog dipanggil.
Aktifkan fitur ini hanya dalam skenario yang memerlukan keandalan tinggi. |
persistentFilePath | string | Jalur penyimpanan cache binlog untuk resumable upload. Default: string kosong. Penting Jalur yang ditentukan harus ada. Setiap instans |
persistentMaxFileCount | int | Jumlah maksimum file persistent. Default: 10. |
persistentMaxFileSize | int | Ukuran maksimum setiap file persistent, dalam byte. Default: 1024*1024. |
persistentMaxLogCount | int | Jumlah maksimum log yang dapat dicache. Default: 64*1024. |
Kode kesalahan
Kode kesalahan | Deskripsi | Solusi |
invalid | SDK belum diinisialisasi atau telah dihapus. | Verifikasi bahwa SDK telah diinisialisasi dengan benar dan metode |
writeError | Terjadi kesalahan penulisan, kemungkinan besar karena kuota traffic tulis Project telah terlampaui. | Sesuaikan kuota traffic tulis untuk Project tersebut. Untuk informasi selengkapnya, lihat Sesuaikan kuota sumber daya. |
dropError | Cache penuh. | Lihat deskripsi parameter untuk kelas |
sendNetworkError | Kesalahan jaringan. | Periksa koneksi jaringan Anda dan coba lagi. |
sendQuotaError | Traffic tulis Project telah mencapai batasnya. | Sesuaikan kuota traffic tulis untuk Project tersebut. Untuk informasi selengkapnya, lihat Sesuaikan kuota sumber daya. |
sendUnauthorized | AccessKey telah kedaluwarsa, tidak valid, atau kebijakan izinnya salah. | Verifikasi bahwa AccessKey Anda valid dan Pengguna RAM terkait memiliki izin yang diperlukan pada resource SLS. Untuk informasi selengkapnya, lihat Berikan izin kepada pengguna RAM. |
sendServerError | Kesalahan server. | Coba lagi operasi tersebut. |
sendDiscardError | Data dibuang. Biasanya disebabkan oleh ketidaksesuaian waktu antara perangkat dan server. | SDK secara otomatis mengirim ulang data tersebut. Tidak diperlukan tindakan apa pun. |
sendTimeError | Waktu perangkat tidak tersinkronisasi dengan waktu server. | SDK secara otomatis menyelesaikan masalah ini. Tidak diperlukan tindakan apa pun. |
sendExitBuffered | Data yang dicache tidak sempat dikirim sebelum SDK dihapus. | Aktifkan resumable upload untuk mencegah kehilangan data. |
parametersInvalid | Parameter inisialisasi SDK tidak valid. | Periksa konfigurasi AccessKey, Endpoint, Project, dan Logstore. |
persistentError | Gagal menulis data cache ke disk. | Verifikasi bahwa jalur file cache dikonfigurasi dengan benar, cache tidak penuh, dan tersedia ruang disk yang cukup. |
unknown | Kesalahan tidak diketahui. | Coba lagi operasi tersebut. |