Google Cloud Functions(以下Cloud Functions)でログレベルを分けたいことあります。
よく Go (go111) で Cloud Functions を利用するのですが、標準のlogパッケージを利用しても、ログレベルを出し分けできません。
- https://cloud.google.com/functions/docs/monitoring/logging#functions-log-helloworld-go
- https://cloud.google.com/logging/docs/setup/go
上記ドキュメントを参考にすると、 Cloud Functions では以下のような書き方になります:
func ExampleLogging(w http.ResponseWriter, r *http.Request) {
ctx := context.Background()
projectID := os.Getenv("GCP_PROJECT")
client, err := logging.NewClient(ctx, projectID)
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}
defer client.Close()
logName := "cloudfunctions.googleapis.com%2Fcloud-functions"
logger := client.Logger(logName).StandardLogger(logging.Info)
logger.Println("info")
}
ちょっと煩雑ですね。また、logパッケージでの出力とは異なり、execution_id
が付与されないため、functionの実行ごとのログがまとめて検索できません。
github.com/groove-x/cloudfunctions/log を使う
この問題を解決するサポートパッケージ github.com/groove-x/cloudfunctions/log を紹介します。
package function
import (
"fmt"
"net/http"
"github.com/groove-x/cloudfunctions/log"
)
func ExampleLogging(w http.ResponseWriter, r *http.Request) {
log.WithRequest(r)
log.Debug("debug")
log.Info("info")
log.Warn("warn")
log.Error("error")
}
シンプルですね!
結果はこちら:
log.WithRequest(r)
でリクエストの情報をloggerに覚えさせることで、 execution_id
や、トレースに関する情報が自動的に追加されます。
以上。