Untuk menjalankan kueri kontekstual, Anda perlu menentukan sumber log seperti file log pada server dan log yang ingin dikueri. Operasi kueri ini mengembalikan log yang dihasilkan sebelum atau setelah log yang ditentukan dari file log tersebut. Untuk informasi lebih lanjut, lihat Kueri Kontekstual. Saat memproses volume besar log, Anda dapat menambahkan pengenal PackId ke log tertentu untuk mengelompokkannya menjadi grup log. Pengenal PackId memungkinkan Anda menanyakan grup log secara efisien dan lengkap, membantu mengidentifikasi konteks sebuah log. Topik ini menjelaskan cara menambahkan pengenal PackId ke log.
Cara kerjanya
Simple Log Service menambahkan pengenal PackId untuk mengaitkan log dengan konteksnya. Format pengenal PackId adalah Awalan-Kontekstual-ID Grup Log. Contoh: 5FA51423DDB54FDA-1E3.
Awalan Kontekstual: Awalan kontekstual merupakan angka heksadesimal. Contoh:
5FA51423DDB54FDA. Log dengan awalan kontekstual yang sama termasuk dalam konteks log yang sama.ID Grup Log: ID grup log adalah angka heksadesimal. Contoh:
1E3. Dalam konteks log yang sama,ID grup logbersifat inkremental. Sebagai contoh,1E3dan1E4menunjukkan grup log yang berdekatan dalam konteks log yang sama.
Server yang digunakan menghasilkan pengenal PackId dan mengunggah log serta pengenal PackId ke Simple Log Service secara bersamaan. Log dengan awalan kontekstual yang sama termasuk dalam konteks log yang sama.
Menghasilkan otomatis Pengenal PackId
Lakukan Kueri Kontekstual pada Log yang Ditulis Menggunakan Producer SDK: Log yang ditulis ke Simple Log Service oleh instance produsen yang sama memiliki konteks yang sama dan dapat langsung digunakan dalam kueri kontekstual. Misalnya, ketika menggunakan Aliyun Log Java Producer atau C Producer untuk menulis log, sistem secara otomatis menghasilkan pengenal PackId dan mengunggah log serta pengenal PackId ke Simple Log Service. Untuk informasi lebih lanjut, lihat Gunakan Aliyun Log Java Producer untuk Menulis Data Log ke Simple Log Service atau SDK Produser C.
Lakukan Kueri Kontekstual pada Log yang Dikumpulkan Menggunakan Logtail: Saat menggunakan Logtail untuk mengumpulkan log, sistem secara otomatis menghasilkan pengenal PackId dan menambahkannya ke log yang dikumpulkan. Log dalam file log pada host atau pod memiliki konteks yang sama dan dapat langsung digunakan dalam kueri kontekstual. Untuk informasi lebih lanjut, lihat Gunakan Logtail untuk Mengumpulkan Log.
Hasilkan manual pengenal PackId dan panggil operasi PutLogs untuk mengunggah log terkait
Parameter
Anda dapat memanggil operasi PutLogs untuk mengunggah log ke Simple Log Service. Untuk informasi lebih lanjut, lihat PutLogs. Setelah pengenal PackId dihasilkan secara manual, atur parameter Key ke __pack_id__ dan parameter Value ke pengenal PackId dalam atribut LogTags dari struktur data LogGroup untuk memanggil operasi PutLogs.
{
"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 sampel
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>Gunakan kode berikut untuk menghasilkan manual pengenal PackId dan memanggil operasi PutLogs untuk mengunggah log. Ganti nilai parameter berikut sesuai dengan kebutuhan bisnis Anda:
project,logstore,endpoint,accessKeyId, danaccessKeySecret.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!"); // Untuk konteks yang sama, tentukan nilai yang sama untuk parameter PackIdGenerator. PackIdGenerator generator1 = new PackIdGenerator(); System.out.println(generator1.generateNewPackId()); System.out.println(generator1.generateNewPackId()); System.out.println(generator1.generateNewPackId()); // Untuk konteks yang berbeda, tentukan nilai yang berbeda untuk parameter PackIdGenerator. PackIdGenerator generator2 = new PackIdGenerator(); System.out.println(generator2.generateNewPackId()); System.out.println(generator2.generateNewPackId()); // Konfigurasikan pengaturan log. String project = "project"; String logstore = "logstore"; String topic = "topic"; String source = "127.0.0.1"; Client client = new Client("endpoint", "accessKeyId", "accessKeySecret"); List<LogItem> logs = new ArrayList<>(); LogItem log = new LogItem(); log.PushBack("hello", "world"); logs.add(log); // Kirim permintaan untuk mengunggah log. PutLogsRequest req = new PutLogsRequest(project, logstore, topic, source, logs); // Sertakan pengenal PackId dalam parameter Tags. req.SetTags(Arrays.asList(new TagContent(TAG_PACK_ID, generator1.generateNewPackId()))); client.PutLogs(req); // Kirim permintaan untuk mengunggah log. 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) { // swallow it } 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(); } } }
Go
Jalankan perintah berikut untuk menginstal SDK Simple Log Service untuk Go dan paket dependensi protobuf:
go get -u github.com/aliyun/aliyun-log-go-sdk go get google.golang.org/protobufGunakan kode berikut untuk menghasilkan manual pengenal PackId dan memanggil operasi PutLogs untuk mengunggah log. Ganti nilai parameter berikut sesuai dengan kebutuhan bisnis Anda:
project,logstore,endpoint,accessKeyId, danaccessKeySecret.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() { // Untuk konteks yang sama, tentukan nilai yang sama untuk parameter PackIdGenerator. g1 := NewPackIdGenerator() fmt.Println(g1.Generate()) fmt.Println(g1.Generate()) fmt.Println(g1.Generate()) // Untuk konteks yang berbeda, tentukan nilai yang berbeda untuk parameter PackIdGenerator. g2 := NewPackIdGenerator() fmt.Println(g2.Generate()) fmt.Println(g2.Generate()) // Konfigurasikan pengaturan log. project := "project" logstore := "logStore" topic := "topic" source := "source" client := sls.CreateNormalInterface("endpoint", "accessKeyId", "accessKeySecret", "") 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"), }, }, }, } // Panggil operasi PostLogStoreLogsV2 untuk mengunggah 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__"), // Sertakan pengenal PackId dalam parameter LogTags. Value: proto.String(g1.Generate()), }, }, }, }) if err != nil { panic(err) } // Panggil operasi PutLogs untuk mengunggah log. Panggil operasi g1.Generate() untuk menghasilkan pengenal PackId baru. err = client.PutLogs(project, logstore, &sls.LogGroup{ Topic: &topic, Source: &source, Logs: logs, LogTags: []*sls.LogTag{ { Key: proto.String("__pack_id__"), // Sertakan pengenal PackId dalam parameter LogTags. 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)) } // buat konteks berdasarkan (hostname, pid, 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 sebuah log
Akses proyek Anda dan klik Logstore yang ingin dikelola. Pada tab , temukan log yang konteksnya ingin dilihat dan klik ikon
.CatatanJika log diunggah ke Simple Log Service dengan memanggil operasi PutLogs, log dengan awalan kontekstual yang sama termasuk dalam konteks log yang sama. Untuk informasi lebih lanjut, lihat PutLogs. Di Simple Log Service, log dikategorikan berdasarkan pengenal PackId. Setelah mengklik ikon Tampilan Konteks sebuah log, Anda dapat melihat log kontekstual dari log tersebut, termasuk log dengan awalan kontekstual yang sama dan termasuk dalam grup log yang berbeda. Log tersebut disorot. Untuk informasi lebih lanjut, lihat Contextual query.

Pada halaman yang muncul, gulir ke atas dan ke bawah untuk melihat log kontekstual.
Referensi
Anda dapat menanyakan konteks sebuah log di konsol Simple Log Service. Untuk informasi lebih lanjut, lihat Kueri Kontekstual.
Anda dapat menggunakan SDK atau API untuk menulis log ke Simple Log Service. Untuk informasi lebih lanjut, lihat Gunakan Aliyun Log Java Producer untuk Menulis Data Log ke Simple Log Service, SDK Produser C, atau PutLogs.