diff --git a/internal/cmd/get.go b/internal/cmd/get.go index 497a859..924f451 100644 --- a/internal/cmd/get.go +++ b/internal/cmd/get.go @@ -17,12 +17,12 @@ package cmd import ( - "log" "os" "github.com/spf13/cobra" "github.com/BBVA/kapow/internal/client" + "github.com/BBVA/kapow/internal/logger" ) // GetCmd is the command line interface for get kapow data operation @@ -38,7 +38,7 @@ var GetCmd = &cobra.Command{ err := client.GetData(dataURL, handler, args[0], os.Stdout) if err != nil { - log.Fatal(err) + logger.L.Fatal(err) } }, } diff --git a/internal/cmd/route.go b/internal/cmd/route.go index 3925517..4d9e720 100644 --- a/internal/cmd/route.go +++ b/internal/cmd/route.go @@ -18,10 +18,10 @@ package cmd import ( "io/ioutil" - "log" "os" "github.com/BBVA/kapow/internal/client" + "github.com/BBVA/kapow/internal/logger" "github.com/spf13/cobra" ) @@ -39,7 +39,7 @@ func init() { controlURL, _ := cmd.Flags().GetString("control-url") if err := client.ListRoutes(controlURL, os.Stdout); err != nil { - log.Fatal(err) + logger.L.Fatal(err) } }, } @@ -67,13 +67,13 @@ func init() { buf, err = ioutil.ReadFile(commandFile) } if err != nil { - log.Fatal(err) + logger.L.Fatal(err) } command = string(buf) } if err := client.AddRoute(controlURL, urlPattern, method, entrypoint, command, os.Stdout); err != nil { - log.Fatal(err) + logger.L.Fatal(err) } }, } @@ -91,7 +91,7 @@ func init() { controlURL, _ := cmd.Flags().GetString("control-url") if err := client.RemoveRoute(controlURL, args[0]); err != nil { - log.Fatal(err) + logger.L.Fatal(err) } }, } diff --git a/internal/cmd/server.go b/internal/cmd/server.go index ccbd8ae..270b6b0 100644 --- a/internal/cmd/server.go +++ b/internal/cmd/server.go @@ -18,13 +18,12 @@ package cmd import ( "errors" - "fmt" - "log" "os" "os/exec" "github.com/spf13/cobra" + "github.com/BBVA/kapow/internal/logger" "github.com/BBVA/kapow/internal/server" ) @@ -62,9 +61,9 @@ var ServerCmd = &cobra.Command{ powfile := args[0] _, err := os.Stat(powfile) if os.IsNotExist(err) { - log.Fatalf("%s does not exist", powfile) + logger.L.Fatalf("%s does not exist", powfile) } - log.Printf("Running powfile: %q\n", powfile) + logger.L.Printf("Running powfile: %q\n", powfile) kapowCMD := exec.Command("bash", powfile) kapowCMD.Stdout = os.Stdout kapowCMD.Stderr = os.Stderr @@ -72,10 +71,9 @@ var ServerCmd = &cobra.Command{ err = kapowCMD.Run() if err != nil { - log.Fatal(err) + logger.L.Fatal(err) } - fmt.Println() - log.Printf("Done running powfile: %q\n", powfile) + logger.L.Printf("Done running powfile: %q\n", powfile) } select {} diff --git a/internal/cmd/set.go b/internal/cmd/set.go index f3e2f95..e272c2e 100644 --- a/internal/cmd/set.go +++ b/internal/cmd/set.go @@ -18,11 +18,11 @@ package cmd import ( "io" - "log" "os" "strings" "github.com/BBVA/kapow/internal/client" + "github.com/BBVA/kapow/internal/logger" "github.com/spf13/cobra" ) @@ -47,7 +47,7 @@ var SetCmd = &cobra.Command{ } if err := client.SetData(dataURL, handler, path, r); err != nil { - log.Fatal(err) + logger.L.Fatal(err) } }, } diff --git a/internal/logger/logger.go b/internal/logger/logger.go new file mode 100644 index 0000000..91442af --- /dev/null +++ b/internal/logger/logger.go @@ -0,0 +1,12 @@ +package logger + +import ( + "log" + "os" +) + +var L *log.Logger + +func init() { + L = log.New(os.Stderr, "", log.LstdFlags|log.Lmicroseconds|log.LUTC) +} diff --git a/internal/server/control/server.go b/internal/server/control/server.go index 8cb611b..82ce965 100644 --- a/internal/server/control/server.go +++ b/internal/server/control/server.go @@ -17,10 +17,11 @@ package control import ( - "log" "net" "net/http" "sync" + + "github.com/BBVA/kapow/internal/logger" ) // Run Starts the control server listening in bindAddr @@ -28,12 +29,12 @@ func Run(bindAddr string, wg *sync.WaitGroup) { listener, err := net.Listen("tcp", bindAddr) if err != nil { - log.Fatal(err) + logger.L.Fatal(err) } // Signal startup - log.Printf("ControlServer listening at %s\n", bindAddr) + logger.L.Printf("ControlServer listening at %s\n", bindAddr) wg.Done() - log.Fatal(http.Serve(listener, configRouter())) + logger.L.Fatal(http.Serve(listener, configRouter())) } diff --git a/internal/server/data/server.go b/internal/server/data/server.go index 8235ed8..1721bf8 100644 --- a/internal/server/data/server.go +++ b/internal/server/data/server.go @@ -17,11 +17,11 @@ package data import ( - "log" "net" "net/http" "sync" + "github.com/BBVA/kapow/internal/logger" "github.com/BBVA/kapow/internal/server/httperror" "github.com/gorilla/mux" ) @@ -87,12 +87,12 @@ func Run(bindAddr string, wg *sync.WaitGroup) { listener, err := net.Listen("tcp", bindAddr) if err != nil { - log.Fatal(err) + logger.L.Fatal(err) } // Signal startup - log.Printf("DataServer listening at %s\n", bindAddr) + logger.L.Printf("DataServer listening at %s\n", bindAddr) wg.Done() - log.Fatal(http.Serve(listener, configRouter(rs))) + logger.L.Fatal(http.Serve(listener, configRouter(rs))) } diff --git a/internal/server/user/mux/handlerbuilder.go b/internal/server/user/mux/handlerbuilder.go index 8c327fd..1865860 100644 --- a/internal/server/user/mux/handlerbuilder.go +++ b/internal/server/user/mux/handlerbuilder.go @@ -18,13 +18,12 @@ package mux import ( "bufio" - "log" "net/http" - "io" "os" "github.com/google/uuid" + "github.com/BBVA/kapow/internal/logger" "github.com/BBVA/kapow/internal/server/data" "github.com/BBVA/kapow/internal/server/model" "github.com/BBVA/kapow/internal/server/user/spawn" @@ -32,7 +31,6 @@ import ( var spawner = spawn.Spawn var idGenerator = uuid.NewUUID -var logHandler io.Writer = os.Stdout func handlerBuilder(route model.Route) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -57,14 +55,14 @@ func handlerBuilder(route model.Route) http.Handler { stdOutR, stdOutW, err = os.Pipe() defer stdOutW.Close() if err != nil { - log.Println(err) + logger.L.Println(err) return } var stdErrR, stdErrW *os.File stdErrR, stdErrW, err = os.Pipe() defer stdErrW.Close() if err != nil { - log.Println(err) + logger.L.Println(err) return } @@ -76,9 +74,8 @@ func handlerBuilder(route model.Route) http.Handler { err = spawner(h, nil, nil) } - if err != nil { - log.Println(err) + logger.L.Println(err) } }) @@ -86,9 +83,8 @@ func handlerBuilder(route model.Route) http.Handler { func logStream(handlerId string, streamName string, stream *os.File) { defer stream.Close() - execLog := log.New(logHandler, "", log.Ldate|log.Ltime|log.LUTC|log.Lmicroseconds) scanner := bufio.NewScanner(stream) for scanner.Scan() { - execLog.Printf("%s %s: %s", handlerId, streamName, scanner.Text()) + logger.L.Printf("%s %s: %s", handlerId, streamName, scanner.Text()) } } diff --git a/internal/server/user/mux/handlerbuilder_test.go b/internal/server/user/mux/handlerbuilder_test.go index ee7b03d..aa53e2a 100644 --- a/internal/server/user/mux/handlerbuilder_test.go +++ b/internal/server/user/mux/handlerbuilder_test.go @@ -22,6 +22,7 @@ import ( "bytes" "errors" "io" + "log" "net/http" "net/http/httptest" "reflect" @@ -31,6 +32,7 @@ import ( "github.com/google/uuid" + "github.com/BBVA/kapow/internal/logger" "github.com/BBVA/kapow/internal/server/data" "github.com/BBVA/kapow/internal/server/model" "github.com/BBVA/kapow/internal/server/user/spawn" @@ -207,7 +209,8 @@ func TestHandlerBuilderLogToLogHandlerWhenDebugIsEnabled(t *testing.T) { route := model.Route{Debug: true} var got string - logHandler = new(bytes.Buffer) + logHandler := new(bytes.Buffer) + logger.L = log.New(logHandler, "", log.LstdFlags) spawner = func(h *model.Handler, out io.Writer, er io.Writer) error { _, _ = out.Write([]byte("this is stdout")) @@ -223,21 +226,21 @@ func TestHandlerBuilderLogToLogHandlerWhenDebugIsEnabled(t *testing.T) { // cannot use a synchronization primitive to wait for them. Sorry. time.Sleep(1 * time.Second) - got = logHandler.(*bytes.Buffer).String() - if ! strings.Contains(got, "this is stdout") { + got = logHandler.String() + if !strings.Contains(got, "this is stdout") { t.Errorf("Stdout not preserved. Actual: %+q", got) } - if ! strings.Contains(got, "this is stderr") { + if !strings.Contains(got, "this is stderr") { t.Errorf("Stderr not preserved. Actual: %+q", got) } } - func TestHandlerBuilderDoesNotLogToLogHandlerWhenDebugIsDisabled(t *testing.T) { data.Handlers = data.New() route := model.Route{Debug: false} - logHandler = new(bytes.Buffer) + logHandler := new(bytes.Buffer) + logger.L = log.New(logHandler, "", log.LstdFlags) spawner = func(h *model.Handler, out io.Writer, er io.Writer) error { if out != nil { @@ -257,7 +260,7 @@ func TestHandlerBuilderDoesNotLogToLogHandlerWhenDebugIsDisabled(t *testing.T) { // cannot use a synchronization primitive to wait for them. Sorry. time.Sleep(1 * time.Second) - size := logHandler.(*bytes.Buffer).Len() + size := logHandler.Len() if size != 0 { t.Error("Something was logged to stderr with debug=false") } diff --git a/internal/server/user/server.go b/internal/server/user/server.go index e8fc3d4..c8173bd 100644 --- a/internal/server/user/server.go +++ b/internal/server/user/server.go @@ -21,11 +21,11 @@ import ( "crypto/x509" "fmt" "io/ioutil" - "log" "net" "net/http" "sync" + "github.com/BBVA/kapow/internal/logger" "github.com/BBVA/kapow/internal/server/user/mux" ) @@ -50,7 +50,7 @@ func Run(bindAddr string, wg *sync.WaitGroup, certFile, keyFile, cliCaFile strin listener, err := net.Listen("tcp", bindAddr) if err != nil { - log.Fatal(err) + logger.L.Fatal(err) } if (certFile != "") && (keyFile != "") { @@ -62,28 +62,28 @@ func Run(bindAddr string, wg *sync.WaitGroup, certFile, keyFile, cliCaFile strin var err error Server.TLSConfig.ClientCAs, err = loadCertificatesFromFile(cliCaFile) if err != nil { - log.Fatalf("UserServer failed to load CA certs: %s\n", err) + logger.L.Fatalf("UserServer failed to load CA certs: %s\n", err) } else { CAStore := "System store" if Server.TLSConfig.ClientCAs != nil { CAStore = cliCaFile } - log.Printf("UserServer using CA certs from %s\n", CAStore) + logger.L.Printf("UserServer using CA certs from %s\n", CAStore) Server.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert } } // Signal startup - log.Printf("UserServer listening at %s\n", bindAddr) + logger.L.Printf("UserServer listening at %s\n", bindAddr) wg.Done() - log.Fatal(Server.ServeTLS(listener, certFile, keyFile)) + logger.L.Fatal(Server.ServeTLS(listener, certFile, keyFile)) } else { // Signal startup - log.Printf("UserServer listening at %s\n", bindAddr) + logger.L.Printf("UserServer listening at %s\n", bindAddr) wg.Done() - log.Fatal(Server.Serve(listener)) + logger.L.Fatal(Server.Serve(listener)) } } diff --git a/main.go b/main.go index 6fd8089..0ed83f5 100644 --- a/main.go +++ b/main.go @@ -17,12 +17,10 @@ package main import ( - "fmt" - "os" - "github.com/spf13/cobra" "github.com/BBVA/kapow/internal/cmd" + "github.com/BBVA/kapow/internal/logger" ) func main() { @@ -35,7 +33,6 @@ func main() { err := kapowCmd.Execute() if err != nil { - fmt.Println(err) - os.Exit(1) + logger.L.Fatalln(err) } }