diff --git a/go.mod b/go.mod index 4fb78a8..090343a 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ replace code.dumpstack.io/tools/out-of-tree/qemu => ./qemu replace code.dumpstack.io/tools/out-of-tree/config => ./config require ( + github.com/BurntSushi/toml v1.2.1 // indirect github.com/alecthomas/kong v0.7.1 github.com/go-git/go-git/v5 v5.6.1 github.com/kylelemons/godebug v1.1.0 // indirect @@ -14,6 +15,7 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.1 + github.com/natefinch/lumberjack v2.0.0+incompatible github.com/olekukonko/tablewriter v0.0.5 github.com/otiai10/copy v1.9.0 github.com/remeh/sizedwaitgroup v1.0.0 @@ -21,4 +23,5 @@ require ( github.com/zcalusic/sysinfo v0.9.5 golang.org/x/crypto v0.7.0 gopkg.in/logrusorgru/aurora.v2 v2.0.3 + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect ) diff --git a/go.sum b/go.sum index f452a86..70cb9c5 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= @@ -73,6 +75,8 @@ github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hz github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= +github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= @@ -185,9 +189,12 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/logrusorgru/aurora.v2 v2.0.3 h1:5Hr76hqgwx9PednedYf5Q1dBfiPMZ2IgExR7u3tNXIE= gopkg.in/logrusorgru/aurora.v2 v2.0.3/go.mod h1:Wm+IEn1fgFp8E2paL93oFVrHZW4toMKARNE85fDY5w8= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= diff --git a/main.go b/main.go index 1c40f00..0d8f27b 100644 --- a/main.go +++ b/main.go @@ -6,12 +6,15 @@ package main import ( "fmt" + "io" "math/rand" "os" + "os/user" "runtime/debug" "strconv" "time" + "github.com/natefinch/lumberjack" "github.com/rs/zerolog" "github.com/rs/zerolog/log" @@ -47,8 +50,6 @@ type LogLevelFlag string func (loglevel LogLevelFlag) AfterApply() error { switch loglevel { case "debug": - zerolog.SetGlobalLevel(zerolog.DebugLevel) - zerolog.CallerMarshalFunc = func(pc uintptr, file string, line int) string { short := file for i := len(file) - 1; i > 0; i-- { @@ -61,12 +62,6 @@ func (loglevel LogLevelFlag) AfterApply() error { return file + ":" + strconv.Itoa(line) } log.Logger = log.With().Caller().Logger() - case "info": - zerolog.SetGlobalLevel(zerolog.InfoLevel) - case "warn": - zerolog.SetGlobalLevel(zerolog.WarnLevel) - case "error": - zerolog.SetGlobalLevel(zerolog.ErrorLevel) } return nil } @@ -81,9 +76,19 @@ func (v VersionFlag) BeforeApply(app *kong.Kong, vars kong.Vars) error { return nil } -func main() { - log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) +type LevelWriter struct { + io.Writer + Level zerolog.Level +} +func (lw *LevelWriter) WriteLevel(l zerolog.Level, p []byte) (n int, err error) { + if l >= lw.Level { + return lw.Writer.Write(p) + } + return len(p), nil +} + +func main() { rand.Seed(time.Now().UnixNano()) cli := CLI{} @@ -99,11 +104,47 @@ func main() { }, ) + var loglevel zerolog.Level + switch cli.LogLevel { + case "debug": + loglevel = zerolog.DebugLevel + case "info": + loglevel = zerolog.InfoLevel + case "warn": + loglevel = zerolog.WarnLevel + case "error": + loglevel = zerolog.ErrorLevel + } + + usr, err := user.Current() + if err != nil { + return + } + + log.Logger = log.Output(zerolog.MultiLevelWriter( + &LevelWriter{Writer: zerolog.NewConsoleWriter( + func(w *zerolog.ConsoleWriter) { + w.Out = os.Stderr + }, + ), + Level: loglevel, + }, + &LevelWriter{Writer: &lumberjack.Logger{ + Filename: usr.HomeDir + "/.out-of-tree/logs/out-of-tree.log", + }, + Level: zerolog.DebugLevel, + }, + )) + + log.Debug().Msg("start out-of-tree") + log.Debug().Msgf("%v", os.Args) + log.Debug().Msgf("%v", cli) + if buildInfo, ok := debug.ReadBuildInfo(); ok { log.Debug().Msgf("%v", buildInfo.GoVersion) log.Debug().Msgf("%v", buildInfo.Settings) } - err := ctx.Run(&cli.Globals) + err = ctx.Run(&cli.Globals) ctx.FatalIfErrorf(err) }