func NewRequestLogger(handler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { rw := w.(*ResponseWriter) reqID, _ := ctxhelper.RequestIDFromContext(rw.Context()) componentName, _ := ctxhelper.ComponentNameFromContext(rw.Context()) logger := log.New(log.Ctx{"component": componentName, "req_id": reqID}) rw.ctx = ctxhelper.NewContextLogger(rw.Context(), logger) start := time.Now() var clientIP string clientIPs := strings.Split(req.Header.Get("X-Forwarded-For"), ",") if len(clientIPs) > 0 { clientIP = strings.TrimSpace(clientIPs[len(clientIPs)-1]) } var err error if clientIP == "" { clientIP, _, err = net.SplitHostPort(req.RemoteAddr) if err != nil { Error(w, err) return } } logger.Info("request started", "method", req.Method, "path", req.URL.Path, "client_ip", clientIP) handler.ServeHTTP(rw, req) logger.Info("request completed", "status", rw.Status(), "duration", time.Since(start)) }) }
func main() { var err error connPoolConfig := pgx.ConnPoolConfig{ ConnConfig: pgx.ConnConfig{ Host: "127.0.0.1", User: "******", Password: "******", Database: "url_shortener", Logger: log.New("module", "pgx"), }, MaxConnections: 5, AfterConnect: afterConnect, } pool, err = pgx.NewConnPool(connPoolConfig) if err != nil { log.Crit("Unable to create connection pool", "error", err) os.Exit(1) } http.HandleFunc("/", urlHandler) log.Info("Starting URL shortener on localhost:8080") err = http.ListenAndServe("localhost:8080", nil) if err != nil { log.Crit("Unable to start web server", "error", err) os.Exit(1) } }
func ServeHTTP() error { logger := log.New() installer := NewInstaller(logger) api := &httpAPI{ Installer: installer, logger: logger, clientConfig: installerJSConfig{ Endpoints: map[string]string{ "clusters": "/clusters", "cluster": "/clusters/:id", "upload_backup": "/clusters/:id/upload-backup", "cert": "/clusters/:id/ca-cert", "events": "/events", "prompt": "/clusters/:id/prompts/:prompt_id", "credentials": "/credentials", "regions": "/regions", "azureSubscriptions": "/azure/subscriptions", }, }, } if creds, err := aws.EnvCreds(); err == nil { api.AWSEnvCreds = creds if c, err := creds.Credentials(); err == nil { api.clientConfig.HasAWSEnvCredentials = true api.clientConfig.AWSEnvCredentialsID = c.AccessKeyID } } httpRouter := httprouter.New() httpRouter.GET("/", api.ServeTemplate) httpRouter.GET("/credentials", api.ServeTemplate) httpRouter.GET("/credentials/:id", api.ServeTemplate) httpRouter.GET("/clusters/:id", api.ServeTemplate) httpRouter.POST("/clusters/:id/upload-backup", api.ReceiveBackup) httpRouter.GET("/clusters/:id/ca-cert", api.GetCert) httpRouter.GET("/clusters/:id/delete", api.ServeTemplate) httpRouter.GET("/oauth/azure", api.ServeTemplate) httpRouter.DELETE("/clusters/:id", api.DeleteCluster) httpRouter.GET("/clusters", api.RedirectRoot) httpRouter.POST("/clusters", api.LaunchCluster) httpRouter.GET("/events", api.Events) httpRouter.POST("/clusters/:id/prompts/:prompt_id", api.Prompt) httpRouter.GET("/assets/*assetPath", api.ServeAsset) httpRouter.POST("/credentials", api.NewCredential) httpRouter.DELETE("/credentials/:type/:id", api.DeleteCredential) httpRouter.GET("/regions", api.GetCloudRegions) httpRouter.GET("/azure/subscriptions", api.GetAzureSubscriptions) l, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { return err } addr := fmt.Sprintf("http://localhost:%d", l.Addr().(*net.TCPAddr).Port) fmt.Printf("Open %s in your browser to continue.\n", addr) browser.OpenURL(addr) return http.Serve(l, api.CorsHandler(httpRouter, addr)) }
func NewState() *State { s := &State{ listeners: make(map[chan host.HostEvent]struct{}), streams: make(map[string]chan<- *host.Job), logger: log.New("app", "sampi.state"), } s.curr.Store(make(map[string]host.Host)) return s }
func NewUpdater(equinoxAppId, publicKeyPEM string) *Updater { logger := log.New() logger.SetHandler(log.DiscardHandler()) return &Updater{ Logger: logger, EquinoxAppId: equinoxAppId, PublicKeyPEM: publicKeyPEM, DefaultChannel: "stable", } }
func BenchmarkLog15Discard(b *testing.B) { logger := log.New() lvl, err := log.LvlFromString("error") if err != nil { b.Fatal(err) } logger.SetHandler(log.LvlFilterHandler(lvl, log.DiscardHandler())) b.ResetTimer() for i := 0; i < b.N; i++ { logger.Debug("benchmark", "i", i, "b.N", b.N) } }
func (api *httpAPI) InstallHandler(w http.ResponseWriter, req *http.Request, params httprouter.Params) { var input *jsonInput if err := httphelper.DecodeJSON(req, &input); err != nil { httphelper.Error(w, err) return } api.InstallerStackMtx.Lock() defer api.InstallerStackMtx.Unlock() if len(api.InstallerStacks) > 0 { httphelper.ObjectExistsError(w, "install already started") return } var id = random.Hex(16) var creds aws.CredentialsProvider if input.Creds.AccessKeyID != "" && input.Creds.SecretAccessKey != "" { creds = aws.Creds(input.Creds.AccessKeyID, input.Creds.SecretAccessKey, "") } else { var err error creds, err = aws.EnvCreds() if err != nil { httphelper.ValidationError(w, "", err.Error()) return } } s := &httpInstaller{ ID: id, PromptOutChan: make(chan *httpPrompt), PromptInChan: make(chan *httpPrompt), logger: log.New(), api: api, } s.Stack = &Stack{ Creds: creds, Region: input.Region, InstanceType: input.InstanceType, NumInstances: input.NumInstances, VpcCidr: input.VpcCidr, SubnetCidr: input.SubnetCidr, PromptInput: s.PromptInput, YesNoPrompt: s.YesNoPrompt, } if err := s.Stack.RunAWS(); err != nil { httphelper.Error(w, err) return } api.InstallerStacks[id] = s go s.handleEvents() httphelper.JSON(w, 200, s) }
func BenchmarkSelectWithLoggingErrorWithLog15(b *testing.B) { connConfig := *defaultConnConfig logger := log.New() lvl, err := log.LvlFromString("error") if err != nil { b.Fatal(err) } logger.SetHandler(log.LvlFilterHandler(lvl, log.DiscardHandler())) connConfig.Logger = logger connConfig.LogLevel = pgx.LogLevelError conn := mustConnect(b, connConfig) defer closeConn(b, conn) benchmarkSelectWithLog(b, conn) }
func TestSpeculativeHandler(t *testing.T) { t.Parallel() // test with an even multiple of the buffer size, less than full buffer size // and not a multiple of the buffer size for _, count := range []int{10000, 50, 432} { recs := make(chan *log.Record) done := make(chan int) spec := SpeculativeHandler(100, log.ChannelHandler(recs)) go func() { defer close(done) expectedCount := int(math.Min(float64(count), float64(100))) expectedIdx := count - expectedCount for r := range recs { if r.Ctx[1] != expectedIdx { t.Errorf("Bad ctx 'i', got %d expected %d", r.Ctx[1], expectedIdx) return } expectedIdx++ expectedCount-- if expectedCount == 0 { // got everything we expected break } } select { case <-recs: t.Errorf("got an extra record we shouldn't have!") default: } }() lg := log.New() lg.SetHandler(spec) for i := 0; i < count; i++ { lg.Debug("test speculative", "i", i) } go spec.Flush() // wait for the go routine to finish <-done } }
func TestHotSwapHandler(t *testing.T) { t.Parallel() h1, r1 := testHandler() l := log.New() h := HotSwapHandler(h1) l.SetHandler(h) l.Info("to h1") if r1.Msg != "to h1" { t.Fatalf("didn't get expected message to h1") } h2, r2 := testHandler() h.Swap(h2) l.Info("to h2") if r2.Msg != "to h2" { t.Fatalf("didn't get expected message to h2") } }
func TestErrorHandler(t *testing.T) { t.Parallel() h, r := testHandler() lg := log.New() lg.SetHandler(EscalateErrHandler( log.LvlFilterHandler(log.LvlError, h))) lg.Debug("some function result", "err", nil) if r.Msg != "" { t.Fatalf("Expected debug level message to be filtered") } lg.Debug("some function result", "err", errors.New("failed operation")) if r.Msg != "some function result" { t.Fatalf("Expected debug level message to be escalated and pass lvlfilter") } if r.Lvl != log.LvlError { t.Fatalf("Expected debug level message to be escalated to LvlError") } }
func init() { logger := Logger{ logger: log.New(log.Ctx{"package": "zfs"}), } gzfs.SetLogger(&logger) }