Kueri kontekstual menemukan log yang berada tepat sebelum dan sesudah log target dari sumber tertentu. Saat memproses volume log yang besar, tetapkan PackId untuk mengelompokkan log terkait guna pengambilan konteks yang cepat dan lengkap.
Cara kerja
PackId mengikuti format awalan kontekstual-ID kelompok log, contohnya 5FA51423DDB54FDA-1E3:
-
awalan kontekstual: Digit heksadesimal huruf kapital, seperti
5FA51423DDB54FDA. Log yang memiliki awalan kontekstual yang sama termasuk dalam konteks log yang sama. -
ID kelompok log: Digit heksadesimal huruf kapital, seperti
1E3. Dalam satu konteks log,ID kelompok logbertambah secara berurutan. Misalnya,1E3dan1E4adalah kelompok yang bersebelahan.
Klien menghasilkan PackId dan mengirimkannya bersama permintaan penulisan log. Simple Log Service mengelompokkan log yang memiliki awalan kontekstual yang sama ke dalam konteks log yang sama.
Hasilkan PackId secara otomatis
-
Log yang ditulis menggunakan SDK produsen: Log dari instans produsen yang sama berbagi konteks dan mendukung kueri kontekstual. Aliyun Log Java Producer dan C Producer SDK secara otomatis menghasilkan dan menyambungkan PackId.
-
Log yang dikumpulkan oleh Logtail: Logtail secara otomatis menghasilkan dan menyambungkan PackId. Log dari file yang sama pada host atau Pod yang sama berbagi konteks dan mendukung kueri kontekstual.
Hasilkan PackId secara manual dengan API PutLogs
Parameter
Saat memanggil API PutLogs, sertakan PackId dalam atribut LogTags dari LogGroup pada permintaan PutLogs Anda. Tetapkan Key ke __pack_id__:
{
"Topic": "my-topic",
"Source": "127.0.0.1",
"LogTags": [
{
"Key": "__pack_id__",
"Value": "5FA51423DDB54FDA-1"
},
{
"Key": "my_other_tag_key",
"Value": "my_other_tag_value"
}
],
"Logs": [
{
"Time": 1728961415,
"Contents": [
{
"Key": "hello",
"Value": "world"
}
]
}
]
}
Kode contoh
Contoh Java
-
Tambahkan dependensi berikut ke file pom.xml.
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.0.1-jre</version> </dependency> <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log</artifactId> <version>0.6.111</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>2.0.12</version> </dependency> -
Jalankan kode berikut untuk menghasilkan PackId dan mengunggahnya melalui PutLogs. Ganti
project,logstore,endpoint,accessKeyId, danaccessKeySecretdengan nilai aktual Anda.package org.example; import com.aliyun.openservices.log.Client; import com.aliyun.openservices.log.common.LogItem; import com.aliyun.openservices.log.common.TagContent; import com.aliyun.openservices.log.exception.LogException; import com.aliyun.openservices.log.request.PutLogsRequest; import com.google.common.base.Charsets; import com.google.common.hash.Hashing; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.concurrent.atomic.AtomicLong; public class Main { private static final String TAG_PACK_ID = "__pack_id__"; private static final int TOKEN_LEN = 4; public static void main(String[] args) throws LogException { System.out.println("Hello world!"); // Gunakan instans PackIdGenerator yang sama untuk konteks yang sama. PackIdGenerator generator1 = new PackIdGenerator(); System.out.println(generator1.generateNewPackId()); System.out.println(generator1.generateNewPackId()); System.out.println(generator1.generateNewPackId()); // Gunakan instans PackIdGenerator yang berbeda untuk konteks yang berbeda. PackIdGenerator generator2 = new PackIdGenerator(); System.out.println(generator2.generateNewPackId()); System.out.println(generator2.generateNewPackId()); // Konfigurasikan parameter log. String project = "your-project-name"; String logstore = "your-logstore-name"; String topic = "your-topic"; String source = "127.0.0.1"; Client client = new Client("your-endpoint", "your-access-key-id", "your-access-key-secret"); List<LogItem> logs = new ArrayList<>(); LogItem log = new LogItem(); log.PushBack("hello", "world"); logs.add(log); // Kirim permintaan log. PutLogsRequest req = new PutLogsRequest(project, logstore, topic, source, logs); // Tambahkan PackId ke daftar tag. req.SetTags(Arrays.asList(new TagContent(TAG_PACK_ID, generator1.generateNewPackId()))); client.PutLogs(req); // Kirim permintaan log lainnya. PutLogsRequest req2 = new PutLogsRequest(project, logstore, topic, source, logs); req.SetTags(Arrays.asList(new TagContent(TAG_PACK_ID, generator1.generateNewPackId()))); client.PutLogs(req2); } public static class NetworkUtils { private NetworkUtils() { } public static boolean isIpAddress(final String ipAddress) { if (ipAddress == null || ipAddress.isEmpty()) { return false; } try { final String[] tokens = ipAddress.split("\\."); if (tokens.length != TOKEN_LEN) { return false; } for (String token : tokens) { int i = Integer.parseInt(token); if (i < 0 || i > 255) { return false; } } return true; } catch (Exception ex) { return false; } } public static String getLocalMachineIp() { try { Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); while (networkInterfaces.hasMoreElements()) { NetworkInterface ni = networkInterfaces.nextElement(); if (!ni.isUp()) { continue; } Enumeration<InetAddress> addresses = ni.getInetAddresses(); while (addresses.hasMoreElements()) { final InetAddress address = addresses.nextElement(); if (!address.isLinkLocalAddress() && address.getHostAddress() != null) { String ipAddress = address.getHostAddress(); if ("127.0.0.1".equals(ipAddress)) { continue; } if (isIpAddress(ipAddress)) { return ipAddress; } } } } } catch (SocketException ex) { // Abaikan pengecualian ini. } return null; } } public static class PackIdGenerator { private static final Logger LOGGER = LoggerFactory.getLogger(PackIdGenerator.class); private static final AtomicLong GENERATORID = new AtomicLong(0); private final String packIdPrefix; private final AtomicLong batchId = new AtomicLong(0); public PackIdGenerator() { packIdPrefix = generatePackIdPrefix(GENERATORID.getAndIncrement()).toUpperCase() + "-"; } public String generateNewPackId() { return packIdPrefix + Long.toHexString(batchId.getAndIncrement()).toUpperCase(); } private String generatePackIdPrefix(Long instanceId) { String ip = NetworkUtils.getLocalMachineIp(); if (ip == null) { LOGGER.warn("Gagal mendapatkan IP mesin lokal, atur IP ke 127.0.0.1"); ip = "127.0.0.1"; } String name = ManagementFactory.getRuntimeMXBean().getName(); String input = ip + "-" + name + "-" + instanceId; return Hashing.farmHashFingerprint64().hashString(input, Charsets.US_ASCII).toString(); } } }
Contoh Go
-
Instal SDK Go dan dependensi protobuf.
go get -u github.com/aliyun/aliyun-log-go-sdk go get google.golang.org/protobuf -
Jalankan kode berikut untuk menghasilkan PackId dan mengunggahnya melalui PutLogs. Ganti
project,logstore,endpoint,accessKeyId, danaccessKeySecretdengan nilai aktual Anda.package main import ( "crypto/md5" "fmt" "os" "sync/atomic" "time" sls "github.com/aliyun/aliyun-log-go-sdk" "google.golang.org/protobuf/proto" ) func main() { // Gunakan instans PackIdGenerator yang sama untuk konteks yang sama. g1 := NewPackIdGenerator() fmt.Println(g1.Generate()) fmt.Println(g1.Generate()) fmt.Println(g1.Generate()) // Gunakan instans PackIdGenerator yang berbeda untuk konteks yang berbeda. g2 := NewPackIdGenerator() fmt.Println(g2.Generate()) fmt.Println(g2.Generate()) // Konfigurasikan parameter log. project := "your-project-name" logstore := "your-logstore-name" topic := "your-topic" source := "your-source" client := sls.CreateNormalInterface("your-endpoint", "your-access-key-id", "your-access-key-secret", "") logs := []*sls.Log{ { Time: proto.Uint32(uint32(time.Now().Unix())), Contents: []*sls.LogContent{ { Key: proto.String("hello"), Value: proto.String("world"), }, { Key: proto.String("hi"), Value: proto.String("world"), }, }, }, } // Gunakan operasi PostLogStoreLogsV2 untuk menulis log. err := client.PostLogStoreLogsV2(project, logstore, &sls.PostLogStoreLogsRequest{ LogGroup: &sls.LogGroup{ Topic: &topic, Source: &source, Logs: logs, LogTags: []*sls.LogTag{ { Key: proto.String("__pack_id__"), // Tambahkan PackId ke daftar tag. Value: proto.String(g1.Generate()), }, }, }, }) if err != nil { panic(err) } // Gunakan operasi PutLogs untuk menulis log. g1.Generate() membuat PackId baru. err = client.PutLogs(project, logstore, &sls.LogGroup{ Topic: &topic, Source: &source, Logs: logs, LogTags: []*sls.LogTag{ { Key: proto.String("__pack_id__"), // Tambahkan PackId ke daftar tag. Value: proto.String(g1.Generate()), }, }, }) if err != nil { panic(err) } } type PackIdGenerator struct { prefix string id atomic.Uint64 } func NewPackIdGenerator() *PackIdGenerator { return &PackIdGenerator{ prefix: generatePackIDPrefix(), id: atomic.Uint64{}, } } func (g *PackIdGenerator) Generate() string { return fmt.Sprintf("%s-%X", g.prefix, g.id.Add(1)) } // Hasilkan konteks dari hostname, PID, dan waktu. func generatePackIDPrefix() string { m := md5.New() m.Write([]byte(time.Now().String())) hostName, _ := os.Hostname() m.Write([]byte(hostName)) m.Write([]byte(fmt.Sprintf("%v", os.Getpid()))) return fmt.Sprintf("%X", m.Sum(nil)) }
Lihat konteks log
-
Pada proyek Anda, klik logstore target. Pada tab , temukan log target dan klik ikon
.CatatanLog yang dikirim melalui PutLogs dengan awalan kontekstual PackId yang sama dikelompokkan ke dalam konteks log yang sama. Klik context view untuk menampilkan kelompok log yang memiliki awalan kontekstual yang sama, dengan log target disorot.
Tetapkan rentang waktu, misalnya 15 menit, lalu klik query / analyze.
-
Gulir halaman untuk melihat konteks log yang dipilih.
Pada panel context view, log saat ini disorot. Gunakan older dan newer untuk menelusuri log yang berdekatan. Pilih bidang dari all fields atau masukkan kata kunci untuk menyorot kecocokan.
Referensi
-
Lihat konteks log di Konsol: Kueri kontekstual.
-
Tulis log melalui SDK atau API: Gunakan Aliyun Log Java Producer untuk menulis data log, C Producer SDK, PutLogs.