diff --git a/cli/cmd/fetchRunner.go b/cli/cmd/fetchRunner.go index 0baa437c4..fd7c6c72b 100644 --- a/cli/cmd/fetchRunner.go +++ b/cli/cmd/fetchRunner.go @@ -5,6 +5,7 @@ import ( "bytes" "fmt" "github.com/up9inc/mizu/cli/kubernetes" + "github.com/up9inc/mizu/cli/mizu" "io" "io/ioutil" "log" @@ -63,7 +64,7 @@ func Unzip(reader *zip.Reader, dest string) error { _ = os.MkdirAll(path, f.Mode()) } else { _ = os.MkdirAll(filepath.Dir(path), f.Mode()) - fmt.Print("writing HAR file [ ", path, " ] .. ") + mizu.Log.Infof("writing HAR file [ %v ]", path) f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) if err != nil { return err @@ -72,7 +73,7 @@ func Unzip(reader *zip.Reader, dest string) error { if err := f.Close(); err != nil { panic(err) } - fmt.Println(" done") + mizu.Log.Info(" done") }() _, err = io.Copy(f, rc) diff --git a/cli/cmd/tap.go b/cli/cmd/tap.go index 6d62e0084..dded96af1 100644 --- a/cli/cmd/tap.go +++ b/cli/cmd/tap.go @@ -67,7 +67,7 @@ Supported protocols are HTTP and gRPC.`, if parseHumanDataSizeErr != nil { return errors.New(fmt.Sprintf("Could not parse --max-entries-db-size value %s", humanMaxEntriesDBSize)) } - fmt.Printf("Mizu will store up to %s of traffic, old traffic will be cleared once the limit is reached.\n", units.BytesToHumanReadable(mizuTapOptions.MaxEntriesDBSizeBytes)) + mizu.Log.Infof("Mizu will store up to %s of traffic, old traffic will be cleared once the limit is reached.\n", units.BytesToHumanReadable(mizuTapOptions.MaxEntriesDBSizeBytes)) directionLowerCase := strings.ToLower(direction) if directionLowerCase == "any" { @@ -79,9 +79,9 @@ Supported protocols are HTTP and gRPC.`, } if mizuTapOptions.Analysis { - fmt.Printf(analysisMessageToConfirm) + mizu.Log.Infof(analysisMessageToConfirm) if !uiUtils.AskForConfirmation("Would you like to proceed [y/n]: ") { - fmt.Println("You can always run mizu without analysis, aborting") + mizu.Log.Infof("You can always run mizu without analysis, aborting") os.Exit(0) } } diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index e086f6c82..e8bd521af 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -3,14 +3,13 @@ package cmd import ( "context" "fmt" - "github.com/romana/rlog" "github.com/up9inc/mizu/cli/kubernetes" "github.com/up9inc/mizu/cli/mizu" "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared/debounce" core "k8s.io/api/core/v1" - "k8s.io/client-go/tools/clientcmd" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/tools/clientcmd" "log" "net/http" "net/url" @@ -40,11 +39,11 @@ func RunMizuTap(podRegexQuery *regexp.Regexp, tappingOptions *MizuTapOptions) { kubernetesProvider, err := kubernetes.NewProvider(tappingOptions.KubeConfigPath) if err != nil { if clientcmd.IsEmptyConfig(err) { - fmt.Printf(mizu.Red, "Couldn't find the kube config file, or file is empty. Try adding '--kube-config='\n") + mizu.Log.Infof(mizu.Red, "Couldn't find the kube config file, or file is empty. Try adding '--kube-config='\n") return } if clientcmd.IsConfigurationInvalid(err) { - fmt.Printf(mizu.Red, "Invalid kube config file. Try using a different config with '--kube-config='\n") + mizu.Log.Infof(mizu.Red, "Invalid kube config file. Try using a different config with '--kube-config='\n") return } } @@ -55,7 +54,7 @@ func RunMizuTap(podRegexQuery *regexp.Regexp, tappingOptions *MizuTapOptions) { targetNamespace := getNamespace(tappingOptions, kubernetesProvider) if matchingPods, err := kubernetesProvider.GetAllPodsMatchingRegex(ctx, podRegexQuery, targetNamespace); err != nil { - fmt.Printf("Error listing pods: %v", err) + mizu.Log.Infof("Error listing pods: %v", err) return } else { currentlyTappedPods = matchingPods @@ -67,14 +66,14 @@ func RunMizuTap(podRegexQuery *regexp.Regexp, tappingOptions *MizuTapOptions) { } else { namespacesStr = "all namespaces" } - fmt.Printf("Tapping pods in %s\n", namespacesStr) + mizu.Log.Infof("Tapping pods in %s\n", namespacesStr) if len(currentlyTappedPods) == 0 { var suggestionStr string if targetNamespace != mizu.K8sAllNamespaces { suggestionStr = "\nSelect a different namespace with -n or tap all namespaces with -A" } - fmt.Printf("Did not find any pods matching the regex argument%s\n", suggestionStr) + mizu.Log.Infof("Did not find any pods matching the regex argument%s\n", suggestionStr) } nodeToTappedPodIPMap, err := getNodeHostToTappedPodIpsMap(currentlyTappedPods) @@ -114,7 +113,7 @@ func createMizuResources(ctx context.Context, kubernetesProvider *kubernetes.Pro func createMizuNamespace(ctx context.Context, kubernetesProvider *kubernetes.Provider) error { _, err := kubernetesProvider.CreateNamespace(ctx, mizu.ResourcesNamespace) if err != nil { - fmt.Printf("Error creating Namespace %s: %v\n", mizu.ResourcesNamespace, err) + mizu.Log.Infof("Error creating Namespace %s: %v\n", mizu.ResourcesNamespace, err) } return err @@ -132,13 +131,13 @@ func createMizuApiServer(ctx context.Context, kubernetesProvider *kubernetes.Pro } _, err = kubernetesProvider.CreateMizuApiServerPod(ctx, mizu.ResourcesNamespace, mizu.ApiServerPodName, tappingOptions.MizuImage, serviceAccountName, mizuApiFilteringOptions, tappingOptions.MaxEntriesDBSizeBytes) if err != nil { - fmt.Printf("Error creating mizu %s pod: %v\n", mizu.ApiServerPodName, err) + mizu.Log.Infof("Error creating mizu %s pod: %v\n", mizu.ApiServerPodName, err) return err } apiServerService, err = kubernetesProvider.CreateService(ctx, mizu.ResourcesNamespace, mizu.ApiServerPodName, mizu.ApiServerPodName) if err != nil { - fmt.Printf("Error creating mizu %s service: %v\n", mizu.ApiServerPodName, err) + mizu.Log.Infof("Error creating mizu %s service: %v\n", mizu.ApiServerPodName, err) return err } @@ -153,7 +152,7 @@ func getMizuApiFilteringOptions(tappingOptions *MizuTapOptions) (*shared.Traffic for _, regexStr := range tappingOptions.PlainTextFilterRegexes { compiledRegex, err := shared.CompileRegexToSerializableRegexp(regexStr) if err != nil { - fmt.Printf("Regex %s is invalid: %v", regexStr, err) + mizu.Log.Infof("Regex %s is invalid: %v", regexStr, err) return nil, err } compiledRegexSlice = append(compiledRegexSlice, compiledRegex) @@ -183,12 +182,12 @@ func updateMizuTappers(ctx context.Context, kubernetesProvider *kubernetes.Provi serviceAccountName, tappingOptions.TapOutgoing, ); err != nil { - fmt.Printf("Error creating mizu tapper daemonset: %v\n", err) + mizu.Log.Infof("Error creating mizu tapper daemonset: %v\n", err) return err } } else { if err := kubernetesProvider.RemoveDaemonSet(ctx, mizu.ResourcesNamespace, mizu.TapperDaemonSetName); err != nil { - fmt.Printf("Error deleting mizu tapper daemonset: %v\n", err) + mizu.Log.Infof("Error deleting mizu tapper daemonset: %v\n", err) return err } } @@ -197,19 +196,19 @@ func updateMizuTappers(ctx context.Context, kubernetesProvider *kubernetes.Provi } func cleanUpMizuResources(kubernetesProvider *kubernetes.Provider) { - fmt.Printf("\nRemoving mizu resources\n") + mizu.Log.Infof("\nRemoving mizu resources\n") removalCtx, cancel := context.WithTimeout(context.Background(), cleanupTimeout) defer cancel() if err := kubernetesProvider.RemoveNamespace(removalCtx, mizu.ResourcesNamespace); err != nil { - fmt.Printf("Error removing Namespace %s: %s (%v,%+v)\n", mizu.ResourcesNamespace, err, err, err) + mizu.Log.Infof("Error removing Namespace %s: %s (%v,%+v)\n", mizu.ResourcesNamespace, err, err, err) return } if mizuServiceAccountExists { if err := kubernetesProvider.RemoveNonNamespacedResources(removalCtx, mizu.ClusterRoleName, mizu.ClusterRoleBindingName); err != nil { - fmt.Printf("Error removing non-namespaced resources: %s (%v,%+v)\n", err, err, err) + mizu.Log.Infof("Error removing non-namespaced resources: %s (%v,%+v)\n", err, err, err) return } } @@ -224,9 +223,9 @@ func cleanUpMizuResources(kubernetesProvider *kubernetes.Provider) { case removalCtx.Err() == context.Canceled: // Do nothing. User interrupted the wait. case err == wait.ErrWaitTimeout: - fmt.Printf("Timeout while removing Namespace %s\n", mizu.ResourcesNamespace) + mizu.Log.Infof("Timeout while removing Namespace %s\n", mizu.ResourcesNamespace) default: - fmt.Printf("Error while waiting for Namespace %s to be deleted: %s (%v,%+v)\n", mizu.ResourcesNamespace, err, err, err) + mizu.Log.Infof("Error while waiting for Namespace %s to be deleted: %s (%v,%+v)\n", mizu.ResourcesNamespace, err, err, err) } } } @@ -238,7 +237,7 @@ func watchPodsForTapping(ctx context.Context, kubernetesProvider *kubernetes.Pro restartTappers := func() { if matchingPods, err := kubernetesProvider.GetAllPodsMatchingRegex(ctx, podRegex, targetNamespace); err != nil { - fmt.Printf("Error getting pods by regex: %s (%v,%+v)\n", err, err, err) + mizu.Log.Infof("Error getting pods by regex: %s (%v,%+v)\n", err, err, err) cancel() } else { currentlyTappedPods = matchingPods @@ -246,12 +245,12 @@ func watchPodsForTapping(ctx context.Context, kubernetesProvider *kubernetes.Pro nodeToTappedPodIPMap, err := getNodeHostToTappedPodIpsMap(currentlyTappedPods) if err != nil { - fmt.Printf("Error building node to ips map: %s (%v,%+v)\n", err, err, err) + mizu.Log.Infof("Error building node to ips map: %s (%v,%+v)\n", err, err, err) cancel() } if err := updateMizuTappers(ctx, kubernetesProvider, nodeToTappedPodIPMap, tappingOptions); err != nil { - fmt.Printf("Error updating daemonset: %s (%v,%+v)\n", err, err, err) + mizu.Log.Infof("Error updating daemonset: %s (%v,%+v)\n", err, err, err) cancel() } } @@ -260,10 +259,10 @@ func watchPodsForTapping(ctx context.Context, kubernetesProvider *kubernetes.Pro for { select { case newTarget := <-added: - fmt.Printf(mizu.Green, fmt.Sprintf("+%s\n", newTarget.Name)) + mizu.Log.Infof(mizu.Green, fmt.Sprintf("+%s\n", newTarget.Name)) case removedTarget := <-removed: - fmt.Printf(mizu.Red, fmt.Sprintf("-%s\n", removedTarget.Name)) + mizu.Log.Infof(mizu.Red, fmt.Sprintf("-%s\n", removedTarget.Name)) restartTappersDebouncer.SetOn() case modifiedTarget := <-modified: @@ -300,7 +299,7 @@ func portForwardApiPod(ctx context.Context, kubernetesProvider *kubernetes.Provi case <-added: continue case <-removed: - fmt.Printf("%s removed\n", mizu.ApiServerPodName) + mizu.Log.Infof("%s removed\n", mizu.ApiServerPodName) cancel() return case modifiedPod := <-modified: @@ -309,12 +308,12 @@ func portForwardApiPod(ctx context.Context, kubernetesProvider *kubernetes.Provi go func() { err := kubernetes.StartProxy(kubernetesProvider, tappingOptions.GuiPort, mizu.ResourcesNamespace, mizu.ApiServerPodName) if err != nil { - fmt.Printf("Error occured while running k8s proxy %v\n", err) + mizu.Log.Infof("Error occured while running k8s proxy %v\n", err) cancel() } }() mizuProxiedUrl := kubernetes.GetMizuApiServerProxiedHostAndPath(tappingOptions.GuiPort) - fmt.Printf("Mizu is available at http://%s\n", mizuProxiedUrl) + mizu.Log.Infof("Mizu is available at http://%s\n", mizuProxiedUrl) time.Sleep(time.Second * 5) // Waiting to be sure the proxy is ready if tappingOptions.Analysis { @@ -324,19 +323,18 @@ func portForwardApiPod(ctx context.Context, kubernetesProvider *kubernetes.Provi if err != nil { log.Fatal(fmt.Sprintf("Failed parsing the URL %v\n", err)) } - rlog.Debugf("Sending get request to %v\n", u.String()) + mizu.Log.Debugf("Sending get request to %v\n", u.String()) if response, err := http.Get(u.String()); err != nil || response.StatusCode != 200 { - fmt.Printf("error sending upload entries req, status code: %v, err: %v\n", response.StatusCode, err) + mizu.Log.Infof("error sending upload entries req, status code: %v, err: %v\n", response.StatusCode, err) } else { - fmt.Printf(mizu.Purple, "Traffic is uploading to UP9 for further analsys") - fmt.Println() + mizu.Log.Infof(mizu.Purple, "Traffic is uploading to UP9 for further analysis\n") } } } case <-timeAfter: if !isPodReady { - fmt.Printf("error: %s pod was not ready in time", mizu.ApiServerPodName) + mizu.Log.Infof("error: %s pod was not ready in time", mizu.ApiServerPodName) cancel() } @@ -349,13 +347,13 @@ func portForwardApiPod(ctx context.Context, kubernetesProvider *kubernetes.Provi func createRBACIfNecessary(ctx context.Context, kubernetesProvider *kubernetes.Provider) bool { mizuRBACExists, err := kubernetesProvider.DoesServiceAccountExist(ctx, mizu.ResourcesNamespace, mizu.ServiceAccountName) if err != nil { - fmt.Printf("warning: could not ensure mizu rbac resources exist %v\n", err) + mizu.Log.Infof("warning: could not ensure mizu rbac resources exist %v\n", err) return false } if !mizuRBACExists { err := kubernetesProvider.CreateMizuRBAC(ctx, mizu.ResourcesNamespace, mizu.ServiceAccountName, mizu.ClusterRoleName, mizu.ClusterRoleBindingName, mizu.RBACVersion) if err != nil { - fmt.Printf("warning: could not create mizu rbac resources %v\n", err) + mizu.Log.Infof("warning: could not create mizu rbac resources %v\n", err) return false } } @@ -392,7 +390,7 @@ func syncApiStatus(ctx context.Context, cancel context.CancelFunc, tappingOption controlSocketStr := fmt.Sprintf("ws://%s/ws", kubernetes.GetMizuApiServerProxiedHostAndPath(tappingOptions.GuiPort)) controlSocket, err := mizu.CreateControlSocket(controlSocketStr) if err != nil { - fmt.Printf("error establishing control socket connection %s\n", err) + mizu.Log.Infof("error establishing control socket connection %s\n", err) cancel() } @@ -403,7 +401,7 @@ func syncApiStatus(ctx context.Context, cancel context.CancelFunc, tappingOption default: err = controlSocket.SendNewTappedPodsListMessage(currentlyTappedPods) if err != nil { - rlog.Debugf("error Sending message via control socket %v, error: %s\n", controlSocketStr, err) + mizu.Log.Debugf("error Sending message via control socket %v, error: %s\n", controlSocketStr, err) } time.Sleep(10 * time.Second) } diff --git a/cli/cmd/version.go b/cli/cmd/version.go index 4fd4b8bf1..dfe071c52 100644 --- a/cli/cmd/version.go +++ b/cli/cmd/version.go @@ -1,12 +1,10 @@ package cmd import ( - "fmt" + "github.com/spf13/cobra" "github.com/up9inc/mizu/cli/mizu" "strconv" "time" - - "github.com/spf13/cobra" ) type MizuVersionOptions struct { @@ -22,11 +20,11 @@ var versionCmd = &cobra.Command{ go mizu.ReportRun("version", mizuVersionOptions) if mizuVersionOptions.DebugInfo { timeStampInt, _ := strconv.ParseInt(mizu.BuildTimestamp, 10, 0) - fmt.Printf("Version: %s \nBranch: %s (%s) \n", mizu.SemVer, mizu.Branch, mizu.GitCommitHash) - fmt.Printf("Build Time: %s (%s)\n", mizu.BuildTimestamp, time.Unix(timeStampInt, 0)) + mizu.Log.Infof("Version: %s \nBranch: %s (%s) \n", mizu.SemVer, mizu.Branch, mizu.GitCommitHash) + mizu.Log.Infof("Build Time: %s (%s)\n", mizu.BuildTimestamp, time.Unix(timeStampInt, 0)) } else { - fmt.Printf("Version: %s (%s)\n", mizu.SemVer, mizu.Branch) + mizu.Log.Infof("Version: %s (%s)\n", mizu.SemVer, mizu.Branch) } return nil }, diff --git a/cli/cmd/viewRunner.go b/cli/cmd/viewRunner.go index d339010a7..cfa1fd657 100644 --- a/cli/cmd/viewRunner.go +++ b/cli/cmd/viewRunner.go @@ -13,11 +13,11 @@ func runMizuView(mizuViewOptions *MizuViewOptions) { kubernetesProvider, err := kubernetes.NewProvider(mizuViewOptions.KubeConfigPath) if err != nil { if clientcmd.IsEmptyConfig(err) { - fmt.Printf(mizu.Red, "Couldn't find the kube config file, or file is empty. Try adding '--kube-config='\n") + mizu.Log.Infof("Couldn't find the kube config file, or file is empty. Try adding '--kube-config='\n") return } if clientcmd.IsConfigurationInvalid(err) { - fmt.Printf(mizu.Red, "Invalid kube config file. Try using a different config with '--kube-config='\n") + mizu.Log.Infof(mizu.Red, "Invalid kube config file. Try using a different config with '--kube-config='\n") return } } @@ -30,21 +30,21 @@ func runMizuView(mizuViewOptions *MizuViewOptions) { panic(err) } if !exists { - fmt.Printf("The %s service not found\n", mizu.ApiServerPodName) + mizu.Log.Infof("The %s service not found\n", mizu.ApiServerPodName) return } mizuProxiedUrl := kubernetes.GetMizuApiServerProxiedHostAndPath(mizuViewOptions.GuiPort) _, err = http.Get(fmt.Sprintf("http://%s/", mizuProxiedUrl)) if err == nil { - fmt.Printf("Found a running service %s and open port %d\n", mizu.ApiServerPodName, mizuViewOptions.GuiPort) + mizu.Log.Infof("Found a running service %s and open port %d\n", mizu.ApiServerPodName, mizuViewOptions.GuiPort) return } - fmt.Printf("Found service %s, creating k8s proxy\n", mizu.ApiServerPodName) + mizu.Log.Infof("Found service %s, creating k8s proxy\n", mizu.ApiServerPodName) - fmt.Printf("Mizu is available at http://%s\n", kubernetes.GetMizuApiServerProxiedHostAndPath(mizuViewOptions.GuiPort)) + mizu.Log.Infof("Mizu is available at http://%s\n", kubernetes.GetMizuApiServerProxiedHostAndPath(mizuViewOptions.GuiPort)) err = kubernetes.StartProxy(kubernetesProvider, mizuViewOptions.GuiPort, mizu.ResourcesNamespace, mizu.ApiServerPodName) if err != nil { - fmt.Printf("Error occured while running k8s proxy %v\n", err) + mizu.Log.Infof("Error occured while running k8s proxy %v\n", err) } } diff --git a/cli/go.mod b/cli/go.mod index 1ad46fbf1..f7566a05f 100644 --- a/cli/go.mod +++ b/cli/go.mod @@ -5,7 +5,7 @@ go 1.16 require ( github.com/google/go-github/v37 v37.0.0 github.com/gorilla/websocket v1.4.2 - github.com/romana/rlog v0.0.0-20171115192701-f018bc92e7d7 + github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/spf13/cobra v1.1.3 github.com/up9inc/mizu/shared v0.0.0 k8s.io/api v0.21.2 diff --git a/cli/go.sum b/cli/go.sum index de1e9bcd7..d9a2b280c 100644 --- a/cli/go.sum +++ b/cli/go.sum @@ -333,6 +333,8 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= diff --git a/cli/kubernetes/provider.go b/cli/kubernetes/provider.go index bf40986c3..1fa057162 100644 --- a/cli/kubernetes/provider.go +++ b/cli/kubernetes/provider.go @@ -6,8 +6,10 @@ import ( "encoding/json" "errors" "fmt" + "github.com/up9inc/mizu/cli/mizu" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/cache" + "k8s.io/client-go/util/homedir" "os" "path/filepath" "regexp" @@ -33,7 +35,6 @@ import ( "k8s.io/client-go/tools/clientcmd" _ "k8s.io/client-go/tools/portforward" watchtools "k8s.io/client-go/tools/watch" - "k8s.io/client-go/util/homedir" ) type Provider struct { @@ -618,6 +619,7 @@ func loadKubernetesConfiguration(kubeConfigPath string) clientcmd.ClientConfig { kubeConfigPath = filepath.Join(home, ".kube", "config") } + mizu.Log.Debugf("Using kube config %s", kubeConfigPath) configPathList := filepath.SplitList(kubeConfigPath) configLoadingRules := &clientcmd.ClientConfigLoadingRules{} if len(configPathList) <= 1 { diff --git a/cli/mizu.go b/cli/mizu.go index 7caa61604..d3ff3c55b 100644 --- a/cli/mizu.go +++ b/cli/mizu.go @@ -1,7 +1,11 @@ package main -import "github.com/up9inc/mizu/cli/cmd" +import ( + "github.com/up9inc/mizu/cli/cmd" + "github.com/up9inc/mizu/cli/mizu" +) func main() { + mizu.InitLogger() cmd.Execute() } diff --git a/cli/mizu/logger.go b/cli/mizu/logger.go new file mode 100644 index 000000000..9283f6e15 --- /dev/null +++ b/cli/mizu/logger.go @@ -0,0 +1,39 @@ +package mizu + +import ( + "fmt" + "github.com/op/go-logging" + "os" + "path" +) + +var Log = logging.MustGetLogger("mizu_cli") + +var format = logging.MustStringFormatter( + `%{time} %{level:.5s} ▶ %{pid} %{shortfile} %{shortfunc} ▶ %{message}`, +) + +func InitLogger() { + homeDirPath, err := os.UserHomeDir() + mizuDirPath := path.Join(homeDirPath, ".mizu") + if err := os.MkdirAll(mizuDirPath, os.ModePerm); err != nil { + panic(fmt.Sprintf("Failed creating .mizu dir: %v, err %v", mizuDirPath, err)) + } + logPath := path.Join(mizuDirPath, "log.log") + f, err := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + panic(fmt.Sprintf("Failed mizu log file: %v, err %v", logPath, err)) + } + + fileLog := logging.NewLogBackend(f, "", 0) + consoleLog := logging.NewLogBackend(os.Stderr, "", 0) + + backend2Formatter := logging.NewBackendFormatter(fileLog, format) + + backend1Leveled := logging.AddModuleLevel(consoleLog) + backend1Leveled.SetLevel(logging.INFO, "") + + logging.SetBackend(backend1Leveled, backend2Formatter) + + Log.Debugf("Running mizu version %v", SemVer) +} diff --git a/cli/mizu/telemetry.go b/cli/mizu/telemetry.go index c1ac8fd1c..73aae4a28 100644 --- a/cli/mizu/telemetry.go +++ b/cli/mizu/telemetry.go @@ -4,7 +4,6 @@ import ( "bytes" "encoding/json" "fmt" - "github.com/romana/rlog" "net/http" ) @@ -12,7 +11,7 @@ const telemetryUrl = "https://us-east4-up9-prod.cloudfunctions.net/mizu-telemetr func ReportRun(cmd string, args interface{}) { if Branch != "main" { - rlog.Debugf("reporting only on main branch") + Log.Debugf("reporting only on main branch") return } argsBytes, _ := json.Marshal(args) @@ -29,8 +28,8 @@ func ReportRun(cmd string, args interface{}) { if resp, err := http.Post(telemetryUrl, "application/json", bytes.NewBuffer(jsonValue)); err != nil { - rlog.Debugf("error sending telemetry err: %v, response %v", err, resp) + Log.Debugf("error sending telemetry err: %v, response %v", err, resp) } else { - rlog.Debugf("Successfully reported telemetry") + Log.Debugf("Successfully reported telemetry") } } diff --git a/cli/mizu/versionCheck.go b/cli/mizu/versionCheck.go index b9d4f0913..cef0e790a 100644 --- a/cli/mizu/versionCheck.go +++ b/cli/mizu/versionCheck.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "github.com/google/go-github/v37/github" - "github.com/romana/rlog" "github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared/semver" "io/ioutil" @@ -45,17 +44,17 @@ func CheckVersionCompatibility(port uint16) (bool, error) { return true, nil } - fmt.Printf(Red, fmt.Sprintf("cli version (%s) is not compatible with api version (%s)\n", SemVer, apiSemVer)) + Log.Infof(Red, fmt.Sprintf("cli version (%s) is not compatible with api version (%s)\n", SemVer, apiSemVer)) return false, nil } func CheckNewerVersion() { - rlog.Debugf("Checking for newer version...") + Log.Debugf("Checking for newer version...") start := time.Now() client := github.NewClient(nil) latestRelease, _, err := client.Repositories.GetLatestRelease(context.Background(), "up9inc", "mizu") if err != nil { - rlog.Debugf("Failed to get latest release") + Log.Debugf("Failed to get latest release") return } @@ -67,26 +66,26 @@ func CheckNewerVersion() { } } if versionFileUrl == "" { - rlog.Debugf("Version file not found in the latest release") + Log.Debugf("Version file not found in the latest release") return } res, err := http.Get(versionFileUrl) if err != nil { - rlog.Debugf("http.Get version asset -> %v", err) + Log.Debugf("http.Get version asset -> %v", err) return } data, err := ioutil.ReadAll(res.Body) res.Body.Close() if err != nil { - rlog.Debugf("ioutil.ReadAll -> %v", err) + Log.Debugf("ioutil.ReadAll -> %v", err) return } gitHubVersion := string(data) gitHubVersion = gitHubVersion[:len(gitHubVersion)-1] - rlog.Debugf("Finished version validation, took %v", time.Since(start)) + Log.Debugf("Finished version validation, took %v", time.Since(start)) if SemVer < gitHubVersion { - fmt.Printf(Yellow, fmt.Sprintf("Update available! %v -> %v (%v)\n", SemVer, gitHubVersion, *latestRelease.HTMLURL)) + Log.Infof(Yellow, fmt.Sprintf("Update available! %v -> %v (%v)\n", SemVer, gitHubVersion, *latestRelease.HTMLURL)) } } diff --git a/cli/uiUtils/confirmation.go b/cli/uiUtils/confirmation.go index 06b912431..7a0da1aac 100644 --- a/cli/uiUtils/confirmation.go +++ b/cli/uiUtils/confirmation.go @@ -2,7 +2,6 @@ package uiUtils import ( "bufio" - "fmt" "github.com/up9inc/mizu/cli/mizu" "log" "os" @@ -12,7 +11,7 @@ import ( func AskForConfirmation(s string) bool { reader := bufio.NewReader(os.Stdin) - fmt.Printf(mizu.Magenta, s) + mizu.Log.Infof(mizu.Magenta, s) response, err := reader.ReadString('\n') if err != nil {