全部产品
Search
文档中心

Simple Log Service:Gunakan pengenal PackId untuk mengaitkan log dengan konteksnya

更新时间:Jul 06, 2025

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 log bersifat inkremental. Sebagai contoh, 1E3 dan 1E4 menunjukkan 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

  1. 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>
  2. 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, dan accessKeySecret.

    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();
            }
        }
    
    }

    Parameter dalam Kode Sampel

    Parameter

    Deskripsi

    Contoh

    project

    Nama proyek Simple Log Service.

    test-project

    logstore

    Nama penyimpanan log Simple Log Service.

    test-logstore

    endpoint

    Titik akhir publik Simple Log Service. Untuk informasi lebih lanjut, lihat Titik Akhir.

    cn-hangzhou.log.aliyuncs.com

    accessKeyId

    ID AccessKey. Untuk informasi lebih lanjut, lihat Buat pasangan AccessKey.

    LTAI****************

    accessKeySecret

    Rahasia AccessKey. Untuk informasi lebih lanjut, lihat Buat pasangan AccessKey.

    yourAccessKeySecret

Go

  1. 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/protobuf
  2. 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, dan accessKeySecret.

    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))
    }
    

    Parameter dalam Kode Sampel

    Parameter

    Deskripsi

    Contoh

    project

    Nama proyek Simple Log Service.

    test-project

    logstore

    Nama penyimpanan log Simple Log Service.

    test-logstore

    endpoint

    Titik akhir publik Simple Log Service. Untuk informasi lebih lanjut, lihat Titik Akhir.

    cn-hangzhou.log.aliyuncs.com

    accessKeyId

    ID AccessKey. Untuk informasi lebih lanjut, lihat Buat pasangan AccessKey.

    LTAI****************

    accessKeySecret

    Rahasia AccessKey. Untuk informasi lebih lanjut, lihat Buat pasangan AccessKey.

    yourAccessKeySecret

Lihat konteks sebuah log

  1. Akses proyek Anda dan klik Logstore yang ingin dikelola. Pada tab Raw Logs > Raw Data, temukan log yang konteksnya ingin dilihat dan klik ikon 查询日志-004.

    Catatan

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

    image

  2. Pada halaman yang muncul, gulir ke atas dan ke bawah untuk melihat log kontekstual.

Referensi