refactor: use a common logger for consistency

All kapow messages will end up in stderr (incl. debug mode).
stdout is reserved for the access logs.

Co-authored-by: Roberto Abdelkader Martínez Pérez <robertomartinezp@gmail.com>
This commit is contained in:
pancho horrillo
2020-12-16 17:29:26 +01:00
parent d62a9dba68
commit 41be4f9344
11 changed files with 60 additions and 53 deletions
+2 -2
View File
@@ -17,12 +17,12 @@
package cmd package cmd
import ( import (
"log"
"os" "os"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/BBVA/kapow/internal/client" "github.com/BBVA/kapow/internal/client"
"github.com/BBVA/kapow/internal/logger"
) )
// GetCmd is the command line interface for get kapow data operation // 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) err := client.GetData(dataURL, handler, args[0], os.Stdout)
if err != nil { if err != nil {
log.Fatal(err) logger.L.Fatal(err)
} }
}, },
} }
+5 -5
View File
@@ -18,10 +18,10 @@ package cmd
import ( import (
"io/ioutil" "io/ioutil"
"log"
"os" "os"
"github.com/BBVA/kapow/internal/client" "github.com/BBVA/kapow/internal/client"
"github.com/BBVA/kapow/internal/logger"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@@ -39,7 +39,7 @@ func init() {
controlURL, _ := cmd.Flags().GetString("control-url") controlURL, _ := cmd.Flags().GetString("control-url")
if err := client.ListRoutes(controlURL, os.Stdout); err != nil { 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) buf, err = ioutil.ReadFile(commandFile)
} }
if err != nil { if err != nil {
log.Fatal(err) logger.L.Fatal(err)
} }
command = string(buf) command = string(buf)
} }
if err := client.AddRoute(controlURL, urlPattern, method, entrypoint, command, os.Stdout); err != nil { 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") controlURL, _ := cmd.Flags().GetString("control-url")
if err := client.RemoveRoute(controlURL, args[0]); err != nil { if err := client.RemoveRoute(controlURL, args[0]); err != nil {
log.Fatal(err) logger.L.Fatal(err)
} }
}, },
} }
+5 -7
View File
@@ -18,13 +18,12 @@ package cmd
import ( import (
"errors" "errors"
"fmt"
"log"
"os" "os"
"os/exec" "os/exec"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/BBVA/kapow/internal/logger"
"github.com/BBVA/kapow/internal/server" "github.com/BBVA/kapow/internal/server"
) )
@@ -62,9 +61,9 @@ var ServerCmd = &cobra.Command{
powfile := args[0] powfile := args[0]
_, err := os.Stat(powfile) _, err := os.Stat(powfile)
if os.IsNotExist(err) { 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 := exec.Command("bash", powfile)
kapowCMD.Stdout = os.Stdout kapowCMD.Stdout = os.Stdout
kapowCMD.Stderr = os.Stderr kapowCMD.Stderr = os.Stderr
@@ -72,10 +71,9 @@ var ServerCmd = &cobra.Command{
err = kapowCMD.Run() err = kapowCMD.Run()
if err != nil { if err != nil {
log.Fatal(err) logger.L.Fatal(err)
} }
fmt.Println() logger.L.Printf("Done running powfile: %q\n", powfile)
log.Printf("Done running powfile: %q\n", powfile)
} }
select {} select {}
+2 -2
View File
@@ -18,11 +18,11 @@ package cmd
import ( import (
"io" "io"
"log"
"os" "os"
"strings" "strings"
"github.com/BBVA/kapow/internal/client" "github.com/BBVA/kapow/internal/client"
"github.com/BBVA/kapow/internal/logger"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@@ -47,7 +47,7 @@ var SetCmd = &cobra.Command{
} }
if err := client.SetData(dataURL, handler, path, r); err != nil { if err := client.SetData(dataURL, handler, path, r); err != nil {
log.Fatal(err) logger.L.Fatal(err)
} }
}, },
} }
+12
View File
@@ -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)
}
+5 -4
View File
@@ -17,10 +17,11 @@
package control package control
import ( import (
"log"
"net" "net"
"net/http" "net/http"
"sync" "sync"
"github.com/BBVA/kapow/internal/logger"
) )
// Run Starts the control server listening in bindAddr // 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) listener, err := net.Listen("tcp", bindAddr)
if err != nil { if err != nil {
log.Fatal(err) logger.L.Fatal(err)
} }
// Signal startup // Signal startup
log.Printf("ControlServer listening at %s\n", bindAddr) logger.L.Printf("ControlServer listening at %s\n", bindAddr)
wg.Done() wg.Done()
log.Fatal(http.Serve(listener, configRouter())) logger.L.Fatal(http.Serve(listener, configRouter()))
} }
+4 -4
View File
@@ -17,11 +17,11 @@
package data package data
import ( import (
"log"
"net" "net"
"net/http" "net/http"
"sync" "sync"
"github.com/BBVA/kapow/internal/logger"
"github.com/BBVA/kapow/internal/server/httperror" "github.com/BBVA/kapow/internal/server/httperror"
"github.com/gorilla/mux" "github.com/gorilla/mux"
) )
@@ -87,12 +87,12 @@ func Run(bindAddr string, wg *sync.WaitGroup) {
listener, err := net.Listen("tcp", bindAddr) listener, err := net.Listen("tcp", bindAddr)
if err != nil { if err != nil {
log.Fatal(err) logger.L.Fatal(err)
} }
// Signal startup // Signal startup
log.Printf("DataServer listening at %s\n", bindAddr) logger.L.Printf("DataServer listening at %s\n", bindAddr)
wg.Done() wg.Done()
log.Fatal(http.Serve(listener, configRouter(rs))) logger.L.Fatal(http.Serve(listener, configRouter(rs)))
} }
+5 -9
View File
@@ -18,13 +18,12 @@ package mux
import ( import (
"bufio" "bufio"
"log"
"net/http" "net/http"
"io"
"os" "os"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/BBVA/kapow/internal/logger"
"github.com/BBVA/kapow/internal/server/data" "github.com/BBVA/kapow/internal/server/data"
"github.com/BBVA/kapow/internal/server/model" "github.com/BBVA/kapow/internal/server/model"
"github.com/BBVA/kapow/internal/server/user/spawn" "github.com/BBVA/kapow/internal/server/user/spawn"
@@ -32,7 +31,6 @@ import (
var spawner = spawn.Spawn var spawner = spawn.Spawn
var idGenerator = uuid.NewUUID var idGenerator = uuid.NewUUID
var logHandler io.Writer = os.Stdout
func handlerBuilder(route model.Route) http.Handler { func handlerBuilder(route model.Route) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 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() stdOutR, stdOutW, err = os.Pipe()
defer stdOutW.Close() defer stdOutW.Close()
if err != nil { if err != nil {
log.Println(err) logger.L.Println(err)
return return
} }
var stdErrR, stdErrW *os.File var stdErrR, stdErrW *os.File
stdErrR, stdErrW, err = os.Pipe() stdErrR, stdErrW, err = os.Pipe()
defer stdErrW.Close() defer stdErrW.Close()
if err != nil { if err != nil {
log.Println(err) logger.L.Println(err)
return return
} }
@@ -76,9 +74,8 @@ func handlerBuilder(route model.Route) http.Handler {
err = spawner(h, nil, nil) err = spawner(h, nil, nil)
} }
if err != 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) { func logStream(handlerId string, streamName string, stream *os.File) {
defer stream.Close() defer stream.Close()
execLog := log.New(logHandler, "", log.Ldate|log.Ltime|log.LUTC|log.Lmicroseconds)
scanner := bufio.NewScanner(stream) scanner := bufio.NewScanner(stream)
for scanner.Scan() { for scanner.Scan() {
execLog.Printf("%s %s: %s", handlerId, streamName, scanner.Text()) logger.L.Printf("%s %s: %s", handlerId, streamName, scanner.Text())
} }
} }
@@ -22,6 +22,7 @@ import (
"bytes" "bytes"
"errors" "errors"
"io" "io"
"log"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"reflect" "reflect"
@@ -31,6 +32,7 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
"github.com/BBVA/kapow/internal/logger"
"github.com/BBVA/kapow/internal/server/data" "github.com/BBVA/kapow/internal/server/data"
"github.com/BBVA/kapow/internal/server/model" "github.com/BBVA/kapow/internal/server/model"
"github.com/BBVA/kapow/internal/server/user/spawn" "github.com/BBVA/kapow/internal/server/user/spawn"
@@ -207,7 +209,8 @@ func TestHandlerBuilderLogToLogHandlerWhenDebugIsEnabled(t *testing.T) {
route := model.Route{Debug: true} route := model.Route{Debug: true}
var got string 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 { spawner = func(h *model.Handler, out io.Writer, er io.Writer) error {
_, _ = out.Write([]byte("this is stdout")) _, _ = out.Write([]byte("this is stdout"))
@@ -223,7 +226,7 @@ func TestHandlerBuilderLogToLogHandlerWhenDebugIsEnabled(t *testing.T) {
// cannot use a synchronization primitive to wait for them. Sorry. // cannot use a synchronization primitive to wait for them. Sorry.
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
got = logHandler.(*bytes.Buffer).String() got = logHandler.String()
if !strings.Contains(got, "this is stdout") { if !strings.Contains(got, "this is stdout") {
t.Errorf("Stdout not preserved. Actual: %+q", got) t.Errorf("Stdout not preserved. Actual: %+q", got)
} }
@@ -232,12 +235,12 @@ func TestHandlerBuilderLogToLogHandlerWhenDebugIsEnabled(t *testing.T) {
} }
} }
func TestHandlerBuilderDoesNotLogToLogHandlerWhenDebugIsDisabled(t *testing.T) { func TestHandlerBuilderDoesNotLogToLogHandlerWhenDebugIsDisabled(t *testing.T) {
data.Handlers = data.New() data.Handlers = data.New()
route := model.Route{Debug: false} 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 { spawner = func(h *model.Handler, out io.Writer, er io.Writer) error {
if out != nil { if out != nil {
@@ -257,7 +260,7 @@ func TestHandlerBuilderDoesNotLogToLogHandlerWhenDebugIsDisabled(t *testing.T) {
// cannot use a synchronization primitive to wait for them. Sorry. // cannot use a synchronization primitive to wait for them. Sorry.
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
size := logHandler.(*bytes.Buffer).Len() size := logHandler.Len()
if size != 0 { if size != 0 {
t.Error("Something was logged to stderr with debug=false") t.Error("Something was logged to stderr with debug=false")
} }
+8 -8
View File
@@ -21,11 +21,11 @@ import (
"crypto/x509" "crypto/x509"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log"
"net" "net"
"net/http" "net/http"
"sync" "sync"
"github.com/BBVA/kapow/internal/logger"
"github.com/BBVA/kapow/internal/server/user/mux" "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) listener, err := net.Listen("tcp", bindAddr)
if err != nil { if err != nil {
log.Fatal(err) logger.L.Fatal(err)
} }
if (certFile != "") && (keyFile != "") { if (certFile != "") && (keyFile != "") {
@@ -62,28 +62,28 @@ func Run(bindAddr string, wg *sync.WaitGroup, certFile, keyFile, cliCaFile strin
var err error var err error
Server.TLSConfig.ClientCAs, err = loadCertificatesFromFile(cliCaFile) Server.TLSConfig.ClientCAs, err = loadCertificatesFromFile(cliCaFile)
if err != nil { 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 { } else {
CAStore := "System store" CAStore := "System store"
if Server.TLSConfig.ClientCAs != nil { if Server.TLSConfig.ClientCAs != nil {
CAStore = cliCaFile 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 Server.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert
} }
} }
// Signal startup // Signal startup
log.Printf("UserServer listening at %s\n", bindAddr) logger.L.Printf("UserServer listening at %s\n", bindAddr)
wg.Done() wg.Done()
log.Fatal(Server.ServeTLS(listener, certFile, keyFile)) logger.L.Fatal(Server.ServeTLS(listener, certFile, keyFile))
} else { } else {
// Signal startup // Signal startup
log.Printf("UserServer listening at %s\n", bindAddr) logger.L.Printf("UserServer listening at %s\n", bindAddr)
wg.Done() wg.Done()
log.Fatal(Server.Serve(listener)) logger.L.Fatal(Server.Serve(listener))
} }
} }
+2 -5
View File
@@ -17,12 +17,10 @@
package main package main
import ( import (
"fmt"
"os"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/BBVA/kapow/internal/cmd" "github.com/BBVA/kapow/internal/cmd"
"github.com/BBVA/kapow/internal/logger"
) )
func main() { func main() {
@@ -35,7 +33,6 @@ func main() {
err := kapowCmd.Execute() err := kapowCmd.Execute()
if err != nil { if err != nil {
fmt.Println(err) logger.L.Fatalln(err)
os.Exit(1)
} }
} }