package main import ( "context" "fmt" "log/slog" "net/http" "time" ) type TimeHandler struct{} func (th TimeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte(time.Now().Format(time.RFC3339))) } type Level string const ( Debug Level = "debug" Info Level = "info" ) func ExtractLogLevel(ctx context.Context) Level { return ctx.Value("log_level").(Level) } func StoreLogLevel(ctx context.Context, level Level) context.Context { return context.WithValue(ctx, "log_level", level) } func GetLogLevelQuery(http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { logLevel := r.URL.Query().Get("log_level") if logLevel != "info" && logLevel != "debug" { slog.Info("Wrong logLevel") } Log(StoreLogLevel(r.Context(), Level(logLevel)), Debug, "Test message") }) } func Log(ctx context.Context, level Level, message string) { var inLevel Level inLevel = ExtractLogLevel(ctx) if level == Debug && inLevel == Debug { fmt.Println(message) } if level == Info && (inLevel == Debug || inLevel == Info) { fmt.Println(message) } } func main() { server := http.Server{ Addr: ":10100", ReadTimeout: 30 * time.Second, WriteTimeout: 90 * time.Second, IdleTimeout: 120 * time.Second, Handler: GetLogLevelQuery(TimeHandler{}), } err := server.ListenAndServe() if err != nil { if err != http.ErrServerClosed { panic(err) } } }