📖

【Go】Cloud Loggingに出力されたログに対しフィルターをかけて取得する

2024/05/30に公開

はじめに

Cloud Loggingに出力されたGAEのログから指定の文字列を含む
ログのjsonPayloadにあるIDを集計する作業がありましたのでここにメモを記します。

また、jsonPayloadの内容が壊れてたのでStringに変換してから
正規表現を利用し取得しています。

以下のリファレンスを参考にしております。

https://pkg.go.dev/cloud.google.com/go/logging/logadmin

コード

func main() {
    ctx := context.Background()
    // GoogleProjectID
    projectID := "YOUR_PROJECT_ID"
    // クライアント生成
    client, err := logadmin.NewClient(ctx, projectID)
    if err != nil {
        log.Fatalf("Failed to create client: %v", err)
    }
    // 現在日時
    startTime := time.Now()
    // 1ヶ月後
    endTime := startTime.AddDate(0, 1, 0)
    // 対象文字列
    queryString := "log infomation"

    // リソースタイプの指定と、時間の範囲指定
    filter := fmt.Sprintf("resource.type = \"gae_app\" AND timestamp >= \"%s\" AND timestamp <= \"%s\" AND \"%s\" ",
        startTime.Format(time.RFC3339),
        endTime.Format(time.RFC3339),
        queryString)

    // フィルターをもとに、ログのエントリを取得
    result := client.Entries(w.ctx, logadmin.Filter(filter), logadmin.NewestFirst())
    var ids []string
    for {
        entry, err := result.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatalf("Failed to EntryIterator Next(): %v", err)
        }
        // 壊れたjsonPayloadをstringに変換
        s := fmt.Sprintf("%v", entry.Payload)
        // 正規表現
        regexp := regexp.MustCompile(`"testID\\\":\\\"([^"]+)\\\"`)
        matches := regexp.FindStringSubmatch(s)
        var id string
        if len(matches) > 0 {
            id = matches[1]
        }
        ids = append(ids, id)
    }
    // testIDを出力
    for _, id := range ids {
        fmt.Sprintf("testID: %v", id)
    }   
}

まとめ

指定の範囲内の時間のログに含まれるIDを取得できました。
ログを書き込む方法については参考資料がありましたが、
ログを取得する方法の参考資料がなかったので今回記載いたしました。

Discussion