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:
+2
-2
@@ -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)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
+2
-2
@@ -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)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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()))
|
||||
}
|
||||
|
||||
@@ -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)))
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user