From 16750607829ecdd4e0a80c9026bed2dfcd0b1678 Mon Sep 17 00:00:00 2001 From: Knut Ahlers Date: Tue, 28 Jul 2015 16:04:24 +0200 Subject: [PATCH] Added levels to logging to silence output if required --- logger/logger.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ main.go | 24 ++++++++++++++++-------- s3.go | 2 +- 3 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 logger/logger.go diff --git a/logger/logger.go b/logger/logger.go new file mode 100644 index 0000000..e20412b --- /dev/null +++ b/logger/logger.go @@ -0,0 +1,47 @@ +package logger + +import "fmt" + +type LogLevel uint + +const ( + Error LogLevel = iota + Warning + Info + Debug +) + +// Logger is a wrapper around output to filter according to levels +type Logger struct { + Level LogLevel +} + +func New(logLevel LogLevel) *Logger { + return &Logger{ + Level: logLevel, + } +} + +func (l *Logger) Log(level LogLevel, line string) { + if l.Level >= level { + fmt.Println(line) + } +} + +func (l *Logger) LogF(level LogLevel, line string, args ...interface{}) { + if l.Level >= level { + fmt.Printf(line, args...) + } +} + +func (l *Logger) ErrorF(line string, args ...interface{}) { + l.LogF(Error, line, args...) +} + +func (l *Logger) InfoF(line string, args ...interface{}) { + l.LogF(Info, line, args...) +} + +func (l *Logger) DebugF(line string, args ...interface{}) { + l.LogF(Debug, line, args...) +} diff --git a/main.go b/main.go index 117523d..d8956f2 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "path" "strings" + "github.com/Luzifer/s3sync/logger" "github.com/spf13/cobra" ) @@ -18,7 +19,9 @@ var ( Public bool PrintVersion bool MaxThreads int + logLevel uint }{} + stdout *logger.Logger version = "dev" ) @@ -53,6 +56,11 @@ func main() { app.Flags().BoolVarP(&cfg.Delete, "delete", "d", false, "Delete files on remote not existing on local") app.Flags().BoolVar(&cfg.PrintVersion, "version", false, "Print version and quit") app.Flags().IntVar(&cfg.MaxThreads, "max-threads", 10, "Use max N parallel threads for file sync") + app.Flags().UintVar(&cfg.logLevel, "loglevel", 2, "Amount of log output (0 = Error only, 3 = Debug)") + + app.ParseFlags(os.Args[1:]) + + stdout = logger.New(logger.LogLevel(cfg.logLevel)) app.Execute() } @@ -94,28 +102,28 @@ func execSync(cmd *cobra.Command, args []string) { if needsCopy { l, err := local.ReadFile(path.Join(localPath, localFile.Filename)) if err != nil { - fmt.Printf("(%d / %d) %s ERR: %s\n", i+1, len(localFiles), localFile.Filename, err) + stdout.ErrorF("(%d / %d) %s ERR: %s\n", i+1, len(localFiles), localFile.Filename, err) return } buffer, err := ioutil.ReadAll(l) if err != nil { - fmt.Printf("(%d / %d) %s ERR: %s\n", i+1, len(localFiles), localFile.Filename, err) + stdout.ErrorF("(%d / %d) %s ERR: %s\n", i+1, len(localFiles), localFile.Filename, err) return } l.Close() err = remote.WriteFile(path.Join(remotePath, localFile.Filename), bytes.NewReader(buffer), cfg.Public) if err != nil { - fmt.Printf("(%d / %d) %s ERR: %s\n", i+1, len(localFiles), localFile.Filename, err) + stdout.ErrorF("(%d / %d) %s ERR: %s\n", i+1, len(localFiles), localFile.Filename, err) return } - fmt.Printf("(%d / %d) %s OK\n", i+1, len(localFiles), localFile.Filename) + stdout.InfoF("(%d / %d) %s OK\n", i+1, len(localFiles), localFile.Filename) return } - fmt.Printf("(%d / %d) %s Skip\n", i+1, len(localFiles), localFile.Filename) + stdout.DebugF("(%d / %d) %s Skip\n", i+1, len(localFiles), localFile.Filename) }(i, localFile) } @@ -134,10 +142,10 @@ func execSync(cmd *cobra.Command, args []string) { if needsDeletion { if err := remote.DeleteFile(path.Join(remotePath, remoteFile.Filename)); err != nil { - fmt.Printf("delete: %s ERR: %s\n", remoteFile.Filename, err) + stdout.ErrorF("delete: %s ERR: %s\n", remoteFile.Filename, err) return } - fmt.Printf("delete: %s OK\n", remoteFile.Filename) + stdout.InfoF("delete: %s OK\n", remoteFile.Filename) } }(remoteFile) } @@ -146,7 +154,7 @@ func execSync(cmd *cobra.Command, args []string) { func errExit(err error) { if err != nil { - fmt.Printf("ERR: %s\n", err) + stdout.ErrorF("ERR: %s\n", err) os.Exit(1) } } diff --git a/s3.go b/s3.go index 541c973..930c4bc 100644 --- a/s3.go +++ b/s3.go @@ -78,7 +78,7 @@ func (s *s3Provider) ListFiles(prefix string) ([]file, error) { case err := <-errChan: return out, err case <-doneTimer.C: - fmt.Printf("Scanning prefixes (%d working, %d left)...\r", len(syncChan), len(prefixChan)) + stdout.DebugF("Scanning prefixes (%d working, %d left)...\r", len(syncChan), len(prefixChan)) if len(prefixChan) == 0 && len(syncChan) == 0 { fmt.Printf("\n") return out, nil