全部产品
Search
文档中心

Simple Log Service:Gunakan Aliyun Log Java Producer untuk menulis data log ke Layanan Log Sederhana

更新时间:Jul 25, 2025

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

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.

Catatan

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:

  1. Verifikasi bahwa versi paket JAR aliyun-log-producer, aliyun-log, dan protobuf-java di proyek Anda sesuai dengan yang ditentukan dalam dokumentasi instalasi. Tingkatkan mereka jika perlu.

  2. 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.

  3. Jika metode onCompletion antarmuka Callback tidak dipanggil, pastikan metode producer.close() dipanggil sebelum program berakhir. Karena transmisi data ditangani oleh thread backend, memanggil producer.close() memastikan tidak ada kehilangan data.

  4. 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.

  5. 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.