Untuk mesin komputasi data besar seperti Flink, Spark, dan Storm, yang memerlukan kompresi log, pengunggahan batch ke Simple Log Service, serta pengurangan konsumsi sumber daya jaringan, API atau SDK mungkin tidak cukup. Aliyun Log Java Producer menyediakan solusi yang efisien dan nyaman untuk mengunggah data ke Simple Log Service dalam skenario tersebut.
Prasyarat
Simple Log Service telah diaktifkan.
SDK Simple Log Service untuk Python telah diinisialisasi.
SDK Layanan Log Sederhana untuk Java telah diinstal. Untuk informasi lebih lanjut, lihat Instal SDK Layanan Log Sederhana untuk Java.
Apa itu Aliyun Log Java Producer
Aliyun Log Java Producer adalah pustaka kelas berkinerja tinggi yang dirancang untuk aplikasi Java dalam lingkungan big data dan konkurensi tinggi. Pustaka ini menawarkan beberapa keuntungan dibandingkan API atau SDK standar, termasuk kinerja tinggi, pemisahan logika komputasi dan I/O, serta manajemen sumber daya. Pustaka ini memanfaatkan fitur penulisan berurutan dari Alibaba Cloud Simple Log Service untuk memastikan pengunggahan log secara terurut.
Simple Log Service menyediakan aplikasi contoh menggunakan Aliyun Log Java Producer untuk memfasilitasi permulaan cepat. Untuk informasi lebih lanjut, lihat Aplikasi Contoh Aliyun Log Producer.
Alur Kerja
Fitur
Keselamatan thread: Semua metode yang diekspos oleh antarmuka Producer aman untuk thread.
Pengiriman asinkron: Memanggil antarmuka pengiriman Producer biasanya mengembalikan respons segera. Producer secara internal menyimpan cache dan menggabungkan data tertunda, lalu mengirimkannya dalam batch untuk meningkatkan throughput.
Percobaan ulang otomatis: Producer mencoba ulang berdasarkan jumlah maksimum percobaan ulang dan waktu backoff yang dikonfigurasi.
Pelacakan perilaku: Melalui Callback atau Future, Anda dapat mendapatkan informasi apakah data saat ini berhasil dikirim, bersama dengan informasi tentang setiap upaya pengiriman, membantu pelacakan masalah dan pengambilan keputusan.
Pemulihan konteks: Log yang dihasilkan oleh instance Producer yang sama berada dalam konteks yang sama, memungkinkan Anda melihat log terkait sebelum dan sesudah log tertentu di sisi server.
Penutupan yang baik: Metode close memastikan bahwa semua data yang disimpan cache oleh Producer diproses sebelum keluar, dan Anda akan menerima notifikasi yang sesuai.
Skenario
Keunggulan producer dibandingkan API atau SDK asli adalah sebagai berikut:
Kinerja tinggi
Dengan data masif dan sumber daya terbatas, mencapai throughput target di ujung penulisan memerlukan logika kontrol yang kompleks, termasuk multi-threading, strategi caching, pengiriman batch, dan pertimbangan menyeluruh terhadap skenario percobaan ulang kegagalan. Producer mengimplementasikan fungsi-fungsi ini, menyederhanakan pengembangan program sambil memberikan keunggulan kinerja.
Asinkron non-blokir
Dengan memori yang tersedia cukup, Producer menyimpan cache data yang dikirim ke logstore, memungkinkan metode pengiriman untuk segera kembali tanpa pemblokiran, mencapai pemisahan logika komputasi dan I/O. Selain itu, Anda dapat memperoleh hasil transmisi data melalui objek Future yang dikembalikan atau Callback yang disediakan.
Sumber daya terkendali
Anda dapat mengontrol ukuran memori yang digunakan oleh Producer untuk menyimpan cache data tertunda melalui parameter, serta mengonfigurasi jumlah thread yang digunakan untuk menjalankan tugas pengiriman data. Ini mencegah Producer mengonsumsi sumber daya tak terbatas dan memungkinkan Anda menyeimbangkan konsumsi sumber daya dan throughput penulisan berdasarkan kondisi aktual.
Lokasi masalah sederhana
Jika transmisi data log gagal, Producer tidak hanya mengembalikan kode status tetapi juga pesan pengecualian tipe String yang menjelaskan alasan kegagalan dan informasi rinci. Misalnya, jika transmisi gagal karena batas waktu koneksi jaringan, pesan pengecualian yang dikembalikan mungkin "koneksi timeout"; jika transmisi gagal karena server tidak merespons, pesan pengecualian yang dikembalikan mungkin "server tidak merespons".
Batasan
Panggilan dasar aliyun-log-producer menggunakan operasi PutLogs untuk mengunggah log, dan ada batasan pada ukuran log mentah yang dapat ditulis setiap kali. Untuk informasi lebih lanjut, lihat Pembacaan dan penulisan data.
Sumber daya dasar Simple Log Service, termasuk jumlah proyek, logstore, shard, LogtailConfig, kelompok mesin, ukuran LogItem tunggal, panjang LogItem (Key), dan panjang LogItem (Value), semuanya dibatasi. Untuk informasi lebih lanjut, lihat Sumber daya dasar.
Setelah kode dijalankan untuk pertama kalinya, aktifkan pengindeksan logstore di konsol Simple Log Service, tunggu satu menit, lalu lakukan kueri.
Saat meminta log di konsol, jika panjang nilai bidang tunggal melebihi panjang maksimum, bagian yang berlebih akan dipotong dan tidak termasuk dalam analisis. Untuk informasi lebih lanjut, lihat Buat indeks.
Penagihan
Biaya yang dikeluarkan menggunakan SDK konsisten dengan biaya yang dikeluarkan menggunakan konsol. Untuk informasi lebih lanjut, lihat Ikhtisar Penagihan.
Langkah 1: Instal Aliyun Log Java Producer
Untuk menggunakan Aliyun Log Java Producer dalam proyek Maven, tambahkan dependensi yang sesuai dalam file pom.xml. Kemudian, Maven akan secara otomatis mengunduh paket JAR yang relevan. Sebagai contoh, tambahkan yang berikut ini di <dependencies>:
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>aliyun-log-producer</artifactId>
<version>0.3.22</version>
</dependency>
Setelah menambahkan dan memperbarui, jika konflik versi dengan dependensi Producer dilaporkan, tambahkan yang berikut ini di <dependencies>:
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>aliyun-log</artifactId>
<version>0.6.114</version>
<classifier>jar-with-dependencies</classifier>
</dependency>Langkah 2: Konfigurasikan ProducerConfig
ProducerConfig digunakan untuk mengatur kebijakan pengiriman. Sesuaikan nilai parameter untuk memenuhi kebutuhan bisnis yang berbeda. Parameter dijelaskan dalam tabel berikut:
Config producerConfig = new ProducerConfig();
producerConfig.setTotalSizeInBytes(104857600);Parameter | Tipe | Deskripsi |
totalSizeInBytes | Integer | Ukuran maksimum log yang dapat disimpan cache oleh instance producer. Nilai default: 100 MB. |
maxBlockMs | Integer | Waktu blokir maksimum selama metode pengiriman dipanggil tetapi ruang yang tersedia dari instance producer tidak mencukupi. Nilai default: 60 detik. Jika waktu blokir maksimum yang Anda tentukan berakhir dan ruang yang tersedia dari instance producer masih tidak mencukupi, metode pengiriman akan memunculkan kesalahan TimeoutException. Jika Anda mengatur parameter ini ke 0 dan ruang yang tersedia dari instance producer tidak mencukupi, metode pengiriman segera memunculkan kesalahan TimeoutException. Jika Anda ingin memblokir metode pengiriman hingga ruang yang tersedia dari instance producer mencukupi, Anda harus mengatur parameter ini ke nilai negatif. |
ioThreadCount | Integer | Jumlah thread untuk tugas pengiriman log. Nilai default adalah jumlah prosesor yang tersedia. |
batchSizeThresholdInBytes | Integer | Ambang batas untuk mengirim batch log. Nilai default: 512 KB. Nilai maksimum: 5 MB. |
batchCountThreshold | Integer | Jumlah log dalam batch sebelum dikirim. Nilai default: 4096. Nilai maksimum: 40960. |
lingerMs | Integer | Penundaan sebelum batch dapat dikirim. Nilai default: 2 detik. Nilai minimum: 100 ms. |
retries | Integer | Jumlah percobaan ulang untuk batch setelah kegagalan awal. Nilai default: 10. Jika parameter ini diatur ke 0 atau kurang, batch masuk ke antrian kegagalan segera setelah kegagalan pertama. |
maxReservedAttempts | Integer | Setiap percobaan untuk mengirim ProducerBatch sesuai dengan percobaan. Parameter ini mengontrol berapa banyak percobaan yang dilaporkan kembali kepada pengguna, dengan menyimpan secara default hanya 11 percobaan terbaru. Meningkatkan parameter ini memungkinkan pelacakan lebih rinci dengan mengorbankan konsumsi memori yang lebih tinggi. |
baseRetryBackoffMs | Integer | Waktu backoff awal untuk percobaan ulang. Nilai default: 100 milidetik. Producer menggunakan algoritma backoff eksponensial, di mana waktu tunggu sebelum percobaan ulang ke-N dihitung sebagai baseRetryBackoffMs × 2^(N-1). |
maxRetryBackoffMs | Integer | Waktu backoff maksimum untuk percobaan ulang. Nilai default: 50 detik. |
adjustShardHash | Boolean | Menentukan apakah akan menyesuaikan shardHash saat metode pengiriman dipanggil. Nilai default: true. |
buckets | Integer | Parameter ini efektif saat adjustShardHash bernilai true. Parameter ini mengelompokkan ulang shardHash menjadi jumlah bucket yang ditentukan. Nilai shardHash yang berbeda mencegah data digabungkan dan dibatch, sehingga membatasi throughput producer. Dengan mengelompokkan ulang shardHash, data dapat lebih efektif dibatch untuk transmisi. Nilai parameter ini harus merupakan pangkat dua integer dalam rentang [1, 256]. Nilai default: 64. |
Langkah 3: Buat producer
Producer mendukung konfigurasi dengan AK atau token STS. Untuk token STS, buat ProjectConfig baru secara berkala dan tambahkan ke ProjectConfigs.
LogProducer adalah kelas implementasi producer, dan memerlukan producerConfig unik. Setelah producerConfig disiapkan, Anda dapat membuat instance producer sebagai berikut:
Producer producer = new LogProducer(producerConfig);Membuat producer memulai beberapa thread, sebuah proses yang intensif sumber daya. Kami merekomendasikan agar Anda berbagi instance producer di seluruh aplikasi. Semua metode LogProducer aman untuk digunakan secara bersamaan oleh thread. Tabel di bawah ini mencantumkan thread dalam instance producer, di mana N adalah nomor instance, dimulai dari 0.
Format nama thread | Jumlah | Deskripsi |
aliyun-log-producer-<N>-mover | 1 | Memindahkan batch yang siap dikirim ke kolam thread pengiriman. |
aliyun-log-producer-<N>-io-thread | ioThreadCount | Thread dalam IOThreadPool yang menjalankan tugas pengiriman data. |
aliyun-log-producer-<N>-success-batch-handler | 1 | Menangani batch yang telah berhasil dikirim. |
aliyun-log-producer-<N>-failure-batch-handler | 1 | Mengelola batch yang gagal dikirim. |
Langkah 4: Konfigurasikan proyek log
ProjectConfig mencakup informasi endpoint proyek tujuan dan kredensial akses yang mewakili identitas pemanggil. Setiap proyek log sesuai dengan satu objek ProjectConfig.
Buat instance sebagai berikut:
ProjectConfig project1 = new ProjectConfig("your-project-1", "cn-hangzhou.log.aliyuncs.com", "accessKeyId", "accessKeySecret");
ProjectConfig project2 = new ProjectConfig("your-project-2", "cn-shanghai.log.aliyuncs.com", "accessKeyId", "accessKeySecret");
producer.putProject(project1);
producer.putProject(project2);Langkah 5: Kirim data
Buat Future atau Callback
Saat mengirim data log dengan Aliyun Log Java Producer, tentukan fungsi Callback untuk menangani proses pengiriman. Fungsi Callback ini dipanggil ketika transmisi data berhasil atau ketika pengecualian terjadi selama pengiriman gagal.
Jika pemrosesan hasil pasca-aplikasi sederhana dan tidak memblokir producer, gunakan callback secara langsung. Jika tidak, gunakan ListenableFuture untuk menangani logika bisnis di thread atau kolam thread terpisah.
Parameter metode dijelaskan di bawah ini:
Parameter | Deskripsi |
project | Proyek tujuan untuk data yang akan dikirim. |
logstore | Logstore tujuan untuk data yang akan dikirim. |
logTem | Data yang akan dikirim. |
completed | Tipe atomik Java untuk memastikan bahwa semua log dikirim (baik berhasil maupun gagal). |
Kirim data
Antarmuka producer menawarkan beberapa metode pengiriman, masing-masing dengan parameter spesifik seperti yang dijelaskan di bawah ini.
Parameter | Deskripsi | Diperlukan |
project | Proyek tujuan. | Ya |
logStore | Logstore tujuan. | Ya |
logItem | Log yang akan dikirim. | Ya |
topic | Topik log. | Tidak Catatan Jika tidak ditentukan, parameter ini diberi nilai "". |
source | Sumber log. | Tidak Catatan Jika tidak ditentukan, parameter ini diberi alamat IP host tempat producer berada. |
shardHash | Nilai hash untuk log yang akan dikirim. Anda dapat menentukan nilai hash sesuai kebutuhan, dan kemudian log ditulis ke shard tertentu di logstore yang ditentukan berdasarkan nilai hash tersebut. | Tidak Catatan Jika tidak ditentukan, data ditulis ke shard acak di logstore tujuan. |
callback | Anda dapat mendefinisikan fungsi Callback yang dipanggil ketika pengiriman log berhasil, atau setelah dibuang setelah beberapa kali gagal mencoba ulang. | Tidak |
Pengecualian umum
Pengecualian | Deskripsi |
TimeoutException | TimeoutException dilempar ketika ukuran log yang disimpan cache oleh producer melebihi batas memori dan gagal mendapatkan memori yang cukup setelah maxBlockMs milidetik. Jika maxBlockMs diatur ke -1, itu menunjukkan periode blokir tak terbatas, dan TimeoutException tidak terjadi. |
IllegalStateException | Jika producer dalam keadaan ditutup (metode close telah dipanggil), maka panggilan selanjutnya ke metode send akan menghasilkan IllegalStateException. |
Langkah 6: Dapatkan hasil pengiriman
Karena metode pengiriman producer bersifat asinkron, hasil pengiriman harus diperoleh melalui future yang dikembalikan atau callback yang disediakan.
Future
Metode send mengembalikan ListenableFuture, yang selain metode get standar juga memungkinkan pendaftaran callback setelah selesai. Kode sampel di bawah ini menunjukkan penggunaan ListenableFuture. Daftarkan FutureCallback untuk future dan jalankan di kolam thread EXECUTOR_SERVICE yang disediakan aplikasi. Untuk contoh lengkap, lihat SampleProducerWithFuture.java.
package com.aliyun.openservices.aliyun.log.producer.sample;
import com.aliyun.openservices.aliyun.log.producer.*;
import com.aliyun.openservices.aliyun.log.producer.errors.LogSizeTooLargeException;
import com.aliyun.openservices.aliyun.log.producer.errors.MaxBatchCountExceedException;
import com.aliyun.openservices.aliyun.log.producer.errors.ProducerException;
import com.aliyun.openservices.aliyun.log.producer.errors.ResultFailedException;
import com.aliyun.openservices.aliyun.log.producer.errors.TimeoutException;
import com.aliyun.openservices.log.common.LogItem;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SampleProducerWithFuture {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleProducerWithFuture.class);
private static final ExecutorService EXECUTOR_SERVICE = Executors
.newFixedThreadPool(Math.max(Runtime.getRuntime().availableProcessors(), 1));
public static void main(String[] args) throws InterruptedException {
Producer producer = Utils.createProducer();
int n = 100;
int size = 20;
// Jumlah log yang telah selesai (baik berhasil dikirim maupun gagal)
final AtomicLong completed = new AtomicLong(0);
for (int i = 0; i < n; ++i) {
List<LogItem> logItems = Utils.generateLogItems(size);
try {
String project = System.getenv("PROJECT");
String logStore = System.getenv("LOG_STORE");
ListenableFuture<Result> f = producer.send(project, logStore, logItems);
Futures.addCallback(
f, new SampleFutureCallback(project, logStore, logItems, completed), EXECUTOR_SERVICE);
} catch (InterruptedException e) {
LOGGER.warn("Thread saat ini telah terganggu selama pengiriman log.");
} catch (Exception e) {
if (e instanceof MaxBatchCountExceedException) {
LOGGER.error("Log melebihi jumlah batch maksimum, e={}", e);
} else if (e instanceof LogSizeTooLargeException) {
LOGGER.error("Ukuran log lebih besar dari ukuran maksimum yang diizinkan, e={}", e);
} else if (e instanceof TimeoutException) {
LOGGER.error("Waktu yang diperlukan untuk mengalokasikan memori untuk log telah terlampaui., e={}", e);
} else {
LOGGER.error("Gagal mengirim log, e=", e);
}
}
}
Utils.doSomething();
try {
producer.close();
} catch (InterruptedException e) {
LOGGER.warn("Thread saat ini telah terganggu dari penutupan.");
} catch (ProducerException e) {
LOGGER.info("Gagal menutup producer, e=", e);
}
EXECUTOR_SERVICE.shutdown();
while (!EXECUTOR_SERVICE.isTerminated()) {
EXECUTOR_SERVICE.awaitTermination(100, TimeUnit.MILLISECONDS);
}
LOGGER.info("Semua log selesai, completed={}", completed.get());
}
private static final class SampleFutureCallback implements FutureCallback<Result> {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleFutureCallback.class);
private final String project;
private final String logStore;
private final List<LogItem> logItems;
private final AtomicLong completed;
SampleFutureCallback(
String project, String logStore, List<LogItem> logItems, AtomicLong completed) {
this.project = project;
this.logStore = logStore;
this.logItems = logItems;
this.completed = completed;
}
@Override
public void onSuccess(@Nullable Result result) {
LOGGER.info("Kirim log berhasil.");
completed.getAndIncrement();
}
@Override
public void onFailure(Throwable t) {
if (t instanceof ResultFailedException) {
Result result = ((ResultFailedException) t).getResult();
LOGGER.error(
"Gagal mengirim log, project={}, logStore={}, result={}", project, logStore, result);
} else {
LOGGER.error("Gagal mengirim log, e=", t);
}
completed.getAndIncrement();
}
}
}Callback
Callback dieksekusi oleh thread internal producer, dan ruang data hanya dilepaskan setelah selesai. Untuk mencegah pemblokiran producer dan mengurangi throughput, hindari operasi panjang dalam callback. Selain itu, jangan panggil metode send untuk percobaan ulang dalam callback. Sebagai gantinya, tangani percobaan ulang dalam callback ListenableFuture. Untuk contoh lengkap, lihat SampleProducerWithCallback.java.
package com.aliyun.openservices.aliyun.log.producer.sample;
import com.aliyun.openservices.aliyun.log.producer.Callback;
import com.aliyun.openservices.aliyun.log.producer.Producer;
import com.aliyun.openservices.aliyun.log.producer.Result;
import com.aliyun.openservices.aliyun.log.producer.errors.LogSizeTooLargeException;
import com.aliyun.openservices.aliyun.log.producer.errors.ProducerException;
import com.aliyun.openservices.aliyun.log.producer.errors.TimeoutException;
import com.aliyun.openservices.log.common.LogItem;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SampleProducerWithCallback {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleProducerWithCallback.class);
private static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws InterruptedException {
final Producer producer = Utils.createProducer();
int nTask = 100;
// Nomor urut monotonik yang akan dimasukkan dalam data setiap log
final AtomicLong sequenceNumber = new AtomicLong(0);
// Jumlah log yang telah selesai (baik berhasil dikirim maupun gagal)
final AtomicLong completed = new AtomicLong(0);
final CountDownLatch latch = new CountDownLatch(nTask);
for (int i = 0; i < nTask; ++i) {
EXECUTOR_SERVICE.submit(
new Runnable() {
@Override
public void run() {
LogItem logItem = Utils.generateLogItem(sequenceNumber.getAndIncrement());
try {
String project = System.getenv("PROJECT");
String logStore = System.getenv("LOG_STORE");
producer.send(
project,
logStore,
Utils.getTopic(),
Utils.getSource(),
logItem,
new SampleCallback(project, logStore, logItem, completed));
} catch (InterruptedException e) {
LOGGER.warn("Thread saat ini telah terganggu selama pengiriman log.");
} catch (Exception e) {
if (e instanceof LogSizeTooLargeException) {
LOGGER.error(
"Ukuran log lebih besar dari ukuran maksimum yang diizinkan, e={}", e);
} else if (e instanceof TimeoutException) {
LOGGER.error(
"Waktu yang diperlukan untuk mengalokasikan memori untuk log telah terlampaui., e={}", e);
} else {
LOGGER.error("Gagal mengirim log, logItem={}, e=", logItem, e);
}
} finally {
latch.countDown();
}
}
});
}
latch.await();
EXECUTOR_SERVICE.shutdown();
Utils.doSomething();
try {
producer.close();
} catch (InterruptedException e) {
LOGGER.warn("Thread saat ini telah terganggu dari penutupan.");
} catch (ProducerException e) {
LOGGER.info("Gagal menutup producer, e=", e);
}
LOGGER.info("Semua log selesai, completed={}", completed.get());
}
private static final class SampleCallback implements Callback {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleCallback.class);
private final String project;
private final String logStore;
private final LogItem logItem;
private final AtomicLong completed;
SampleCallback(String project, String logStore, LogItem logItem, AtomicLong completed) {
this.project = project;
this.logStore = logStore;
this.logItem = logItem;
this.completed = completed;
}
@Override
public void onCompletion(Result result) {
try {
if (result.isSuccessful()) {
LOGGER.info("Kirim log berhasil.");
} else {
LOGGER.error(
"Gagal mengirim log, project={}, logStore={}, logItem={}, result={}",
project,
logStore,
logItem.ToJsonString(),
result);
}
} finally {
completed.getAndIncrement();
}
}
}
}Langkah 7: Tutup producer
Ketika producer tidak lagi diperlukan atau proses keluar, tutup producer untuk memastikan semua data yang disimpan cache diproses. Dua mode shutdown didukung: shutdown aman dan shutdown terbatas.
Shutdown aman
Shutdown aman direkomendasikan dalam kebanyakan kasus, menggunakan metode close(). Metode close() menunggu semua data yang disimpan cache diproses, thread berhenti, callback dieksekusi, dan future selesai sebelum kembali.
Meskipun metode ini menunggu semua data diproses, ia segera kembali jika callback tidak diblokir, dan batch segera diproses tanpa percobaan ulang setelah penutupan.
Shutdown terbatas
Untuk pengembalian cepat ketika callback mungkin memblokir, gunakan shutdown terbatas dengan metode close(long timeoutMs). Jika producer tidak sepenuhnya ditutup setelah timeoutMs yang ditentukan, IllegalStateException akan dilemparkan, menunjukkan potensi kehilangan data dan callback yang belum dieksekusi.
FAQ
Apakah ada batasan pada jumlah operasi penulisan data?
Jumlah dan ukuran operasi baca dan tulis di Simple Log Service dibatasi. Untuk informasi lebih lanjut, lihat Pembacaan dan penulisan data.
Sumber daya dasar Simple Log Service, termasuk jumlah proyek, logstore, shard, LogtailConfig, kelompok mesin, ukuran LogItem tunggal, panjang LogItem (Key), dan panjang LogItem (Value), semuanya dibatasi. Untuk informasi lebih lanjut, lihat Sumber daya dasar.
Apa yang harus saya lakukan jika tidak ada data yang ditulis ke Layanan Log Sederhana?
Jika tidak ada data yang ditulis ke Simple Log Service, ikuti langkah-langkah pemecahan masalah berikut:
Verifikasi bahwa versi paket JAR
aliyun-log-producer,aliyun-log, danprotobuf-javadi proyek Anda sesuai dengan yang ditentukan dalam dokumentasi instalasi. Tingkatkan mereka jika perlu.Metode send Aliyun Log Java Producer bersifat asinkron, sehingga data yang dikembalikan tidak langsung tersedia. Gunakan objek Callback atau Future untuk menentukan penyebab kegagalan pengiriman.
Jika metode onCompletion antarmuka Callback tidak dipanggil, pastikan metode
producer.close()dipanggil sebelum program berakhir. Karena transmisi data ditangani oleh thread backend, memanggilproducer.close()memastikan tidak ada kehilangan data.Aliyun Log Java Producer menggunakan kerangka logging SLF4J untuk mengembalikan perilaku runtime. Konfigurasikan kerangka logging di program Anda dan aktifkan logging tingkat DEBUG untuk memeriksa log ERROR.
Jika masalah tetap ada setelah Anda menyelesaikan langkah-langkah sebelumnya, ajukan tiket.
Referensi
Jika respons yang dikembalikan oleh Simple Log Service berisi informasi kesalahan setelah Anda memanggil operasi API, pemanggilan gagal. Anda dapat menangani kesalahan berdasarkan kode kesalahan yang dikembalikan ketika pemanggilan API gagal. Untuk informasi lebih lanjut, lihat Kode kesalahan.
Simple Log Service juga kompatibel dengan SDK Alibaba Cloud. Untuk informasi lebih lanjut, lihat Simple Log Service_SDK Center_Alibaba Cloud OpenAPI Explorer.
Simple Log Service menyediakan antarmuka baris perintah (CLI) untuk memenuhi persyaratan konfigurasi otomatis di Simple Log Service. Untuk informasi lebih lanjut, lihat Ikhtisar CLI Simple Log Service.
Untuk lebih banyak kode contoh, lihat Alibaba Cloud Simple Log Service SDK for Java di GitHub.