📖
【Go】Cloud Loggingに出力されたログに対しフィルターをかけて取得する
はじめに
Cloud Loggingに出力されたGAEのログから指定の文字列を含む
ログのjsonPayloadにあるIDを集計する作業がありましたのでここにメモを記します。
また、jsonPayloadの内容が壊れてたのでStringに変換してから
正規表現を利用し取得しています。
以下のリファレンスを参考にしております。
コード
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