example/context/context_sample.go (118 lines of code) (raw):
package main
import (
"crypto/md5"
"fmt"
"os"
"time"
sls "github.com/aliyun/aliyun-log-go-sdk"
"github.com/aliyun/aliyun-log-go-sdk/example/util"
"github.com/gogo/protobuf/proto"
)
func panicCheck(err error, msg string) {
if err != nil {
fmt.Println(err)
panic(msg)
}
}
func postLogGroup(logCount int, packID string, logstore *sls.LogStore) {
lg := &sls.LogGroup{
Topic: proto.String(""),
Source: proto.String("11.11.11.11"),
LogTags: []*sls.LogTag{
&sls.LogTag{Key: proto.String("__pack_id__"), Value: proto.String(packID)},
&sls.LogTag{Key: proto.String("__extra_tag__"), Value: proto.String("extra_tag_value")},
},
}
for idx := 0; idx < logCount; idx++ {
log := &sls.Log{
Time: proto.Uint32(uint32(time.Now().Unix())),
Contents: []*sls.LogContent{
&sls.LogContent{Key: proto.String("index"), Value: proto.String(fmt.Sprint(idx))},
},
}
lg.Logs = append(lg.Logs, log)
}
panicCheck(logstore.PutLogs(lg), "PutLogs")
}
// generatePackIDPrefix generates a PackID by MD5(time, hostname, PID).
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))
}
func main() {
sls.GlobalForceUsingHTTP = true
fmt.Println(util.AccessKeyID)
client := sls.CreateNormalInterface(util.Endpoint, util.AccessKeyID, util.AccessKeySecret, "")
project, err := client.GetProject(util.ProjectName)
panicCheck(err, "GetProject")
logstore, err := sls.NewLogStore(util.LogStoreName, project)
panicCheck(err, "NewLogStore")
beginTime := time.Now()
// Write several log groups with same pack prefix. PackID format: {PackPrefix}-{HexSequenceID}.
packagePrefix := generatePackIDPrefix()
for seqID := 0; seqID <= 10; seqID++ {
postLogGroup(20, fmt.Sprintf("%v-%X", packagePrefix, seqID), logstore)
}
time.Sleep(time.Second * 5)
// Use GetLogs to acquire packMeta by querying packID.
queriedPackID := fmt.Sprintf("%v-%X", packagePrefix, 8)
from := beginTime.Unix() - 120
to := time.Now().Unix() + 60
resp, err := logstore.GetLogs("", from, to,
fmt.Sprintf("__tag__:__pack_id__:%v|with_pack_meta", queriedPackID),
20, 0, false)
panicCheck(err, "GetLogs")
fmt.Println("GetLogs response", resp.Count)
middleLog := resp.Logs[resp.Count/2]
packID := middleLog["__tag__:__pack_id__"]
packMeta := middleLog["__pack_meta__"]
fmt.Println(packID, packMeta)
// Get context logs from both directions.
contextResp, err := logstore.GetContextLogs(30, 30, packID, packMeta)
panicCheck(err, "GetContextLogs")
fmt.Println("GetContextLogs response", contextResp.TotalLines)
fmt.Println("back lines", contextResp.BackLines)
fmt.Println("forward lines", contextResp.ForwardLines)
fmt.Println("oldest context log", contextResp.Logs[0])
fmt.Println("newest context log", contextResp.Logs[contextResp.TotalLines-1])
// Use the first log to fetch backward.
fmt.Println("fetch context logs backward...")
{
log := contextResp.Logs[0]
for loopIdx := 0; loopIdx < 5; loopIdx++ {
packID := log["__tag__:__pack_id__"]
packMeta := log["__pack_meta__"]
fmt.Printf("[Loop %v] ID: %v, meta: %v\n", loopIdx, packID, packMeta)
resp, err := logstore.GetContextLogs(30, 0, packID, packMeta)
panicCheck(err, fmt.Sprintf("GetContextLogs backward %v", loopIdx))
fmt.Printf("[Loop %v] backward total lines: %v, back lines: %v\n",
loopIdx, resp.TotalLines, resp.BackLines)
if resp.TotalLines == 0 {
fmt.Println("No more log backward")
break
}
log = resp.Logs[0]
fmt.Printf("[Loop %v] log: %v\n", loopIdx, log)
time.Sleep(time.Second)
}
}
// Use the last log to fetch forward.
fmt.Println("fetch context logs forward...")
{
log := contextResp.Logs[contextResp.TotalLines-1]
for loopIdx := 0; loopIdx < 5; loopIdx++ {
packID := log["__tag__:__pack_id__"]
packMeta := log["__pack_meta__"]
fmt.Printf("[Loop %v] ID: %v, meta: %v\n", loopIdx, packID, packMeta)
resp, err := logstore.GetContextLogs(0, 30, packID, packMeta)
panicCheck(err, fmt.Sprintf("GetContextLogs backward %v", loopIdx))
fmt.Printf("[Loop %v] forward total lines: %v, lines: %v\n",
loopIdx, resp.TotalLines, resp.ForwardLines)
if resp.TotalLines == 0 {
fmt.Println("No more log forward")
break
}
log = resp.Logs[resp.TotalLines-1]
fmt.Printf("[Loop %v] log: %v\n", loopIdx, log)
time.Sleep(time.Second)
}
}
}