※追記 2025-10-26T21:09
stdoutで詰まっている説。 SetDefaultの前後でログを出力していて、AWS Lambdaのデフォルトのレポート出力と競合している? デフォルトのレポート出力中に、SetDefaultがスイッチをしようとしてロック? 解決策 「関数の起動直後のSetDefaultをしてかついる場合は、ログを極力出さない」かもです。こんなんでいいのか、という気もします。 経過見て、余力あれば追記します。以下、発生していた問題です。
独自に slog.Handler 実装して slog.HandlerOptions.Levelを指定すると、slog.SetDefaultした瞬間に動かなくなる。
// main.go
logger := slog.New(mylog.NewJSONHandler(os.Stdout,
&slog.HandlerOptions{Level: slog.LevelDebug},
))
slog.SetDefault(logger) // ここで死ぬ
// mylog.go
type mylogHandler struct {
slog.Handler
}
func NewJSONHandler(w io.Writer, opts *slog.HandlerOptions) slog.Handler {
return &mylogHandler{Handler: slog.NewJSONHandler(w, opts)}
}
※ AWS Lambda だと動かない問題が発生して、ローカルで動かすとなんの問題もない、という不思議状態。
問題点以上。上のコードに加えて、前後でslog.Debugなどを2,3コ出力していた。 以下、誤った解決策。
一応、下で解決した。
logger := slog.New(mylog.NewJSONHandler(os.Stdout, nil))
slog.SetDefault(logger)
slog.SetLogLoggerLevel(slog.LevelDebug)
// いける
// slog.HandlerOptions で渡さずに、 slog.SetLogLoggerLevel で指定する。
内部でデッドロックしているかもで、関連するISSUEもあるよう。 原因は正直不明で、気が向いたら調査します。 わからん。
