Skip to content

Commit

Permalink
Extends Logger interface and adds -v and --loglevel flags for verbose…
Browse files Browse the repository at this point in the history
… output
  • Loading branch information
ma-hartma committed Sep 8, 2021
1 parent af9d418 commit 137c364
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 50 deletions.
1 change: 0 additions & 1 deletion cmd/knoxite/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ package main
import (
"bytes"
"fmt"
"log"
"strconv"
"strings"

Expand Down
54 changes: 31 additions & 23 deletions cmd/knoxite/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ import (
)

type Logger struct {
VerbosityLevel knoxite.Verbosity
w io.Writer
LogLevel knoxite.LogLevel
w io.Writer
}

func NewLogger(v knoxite.Verbosity) *Logger {
func NewLogger(v knoxite.LogLevel) *Logger {
return &Logger{
VerbosityLevel: v,
w: os.Stdout,
LogLevel: v,
w: os.Stdout,
}
}

Expand All @@ -33,6 +33,16 @@ func (l *Logger) WithWriter(w io.Writer) *Logger {
return l
}

func (l Logger) Fatal(v ...interface{}) {
l.log(knoxite.LogLevelFatal, v...)
os.Exit(1)
}

func (l Logger) Fatalf(format string, v ...interface{}) {
l.logf(knoxite.LogLevelFatal, format, v...)
os.Exit(1)
}

func (l Logger) Warn(v ...interface{}) {
l.log(knoxite.LogLevelWarning, v...)
}
Expand All @@ -41,6 +51,14 @@ func (l Logger) Warnf(format string, v ...interface{}) {
l.logf(knoxite.LogLevelWarning, format, v...)
}

func (l Logger) Print(v ...interface{}) {
l.log(knoxite.LogLevelPrint, v...)
}

func (l Logger) Printf(format string, v ...interface{}) {
l.logf(knoxite.LogLevelPrint, format, v...)
}

func (l Logger) Info(v ...interface{}) {
l.log(knoxite.LogLevelInfo, v...)
}
Expand All @@ -57,30 +75,20 @@ func (l Logger) Debugf(format string, v ...interface{}) {
l.logf(knoxite.LogLevelDebug, format, v...)
}

func (l Logger) Fatal(v ...interface{}) {
l.log(knoxite.LogLevelFatal, v...)
os.Exit(1)
}

func (l Logger) Fatalf(format string, v ...interface{}) {
l.logf(knoxite.LogLevelFatal, format, v...)
os.Exit(1)
}

func (l Logger) log(verbosity knoxite.Verbosity, v ...interface{}) {
if verbosity <= l.VerbosityLevel {
l.printV(verbosity, v...)
func (l Logger) log(logLevel knoxite.LogLevel, v ...interface{}) {
if logLevel <= l.LogLevel {
l.printV(logLevel, v...)
}
}

func (l Logger) logf(verbosity knoxite.Verbosity, format string, v ...interface{}) {
if verbosity <= l.VerbosityLevel {
l.printV(verbosity, fmt.Sprintf(format, v...))
func (l Logger) logf(logLevel knoxite.LogLevel, format string, v ...interface{}) {
if logLevel <= l.LogLevel {
l.printV(logLevel, fmt.Sprintf(format, v...))
}
}

func (l Logger) printV(verbosity knoxite.Verbosity, v ...interface{}) {
_, _ = l.w.Write([]byte(verbosity.String() + ": "))
func (l Logger) printV(logLevel knoxite.LogLevel, v ...interface{}) {
_, _ = l.w.Write([]byte(logLevel.String() + ": "))
_, _ = l.w.Write([]byte(fmt.Sprint(v...)))
_, _ = l.w.Write([]byte("\n"))
}
35 changes: 22 additions & 13 deletions cmd/knoxite/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ package main

import (
"fmt"
"io/ioutil"
"log"
"os"
"syscall"

Expand Down Expand Up @@ -41,7 +39,8 @@ type GlobalOptions struct {
Alias string
Password string
ConfigURL string
Verbosity string
Verbosity bool
LogLevel string
}

var (
Expand All @@ -57,25 +56,26 @@ var (
Short: "Knoxite is a data storage & backup tool",
Long: "Knoxite is a secure and flexible data storage and backup tool\n" +
"Complete documentation is available at https://github.com/knoxite/knoxite",
SilenceErrors: true,
SilenceUsage: true,
SilenceErrors: true,
SilenceUsage: true,
DisableAutoGenTag: true,
}

logger knoxite.Logger
log knoxite.Logger
)

func main() {
shutdown.OnSignal(0, os.Interrupt, syscall.SIGTERM)
// quiet shutdown logger
shutdown.Logger = shutdown.LogPrinter(log.New(ioutil.Discard, "", log.LstdFlags))
shutdown.Logger = shutdown.LogPrinter(knoxite.NopLogger{})
// shutdown.SetTimeout(0)

RootCmd.PersistentFlags().StringVarP(&globalOpts.Repo, "repo", "r", "", "Repository directory to backup to/restore from (default: current working dir)")
RootCmd.PersistentFlags().StringVarP(&globalOpts.Alias, "alias", "R", "", "Repository alias to backup to/restore from")
RootCmd.PersistentFlags().StringVar(&globalOpts.Password, "password", "", "Password to use for data encryption")
RootCmd.PersistentFlags().StringVarP(&globalOpts.ConfigURL, "configURL", "C", config.DefaultPath(), "Path to the configuration file")
RootCmd.PersistentFlags().StringVarP(&globalOpts.Verbosity, "verbose", "v", "Warning", "Verbose output: possible levels are Debug, Info and Warning")
RootCmd.PersistentFlags().StringVar(&globalOpts.LogLevel, "loglevel", "Warning", "Verbose output. Possible levels are Debug, Info and Warning")
RootCmd.PersistentFlags().BoolVarP(&globalOpts.Verbosity, "verbose", "v", false, "Verbose output on log level Info. Use --loglevel to choose between Debug, Info and Warning")

globalOpts.Repo = os.Getenv("KNOXITE_REPOSITORY")
globalOpts.Password = os.Getenv("KNOXITE_PASSWORD")
Expand All @@ -101,8 +101,17 @@ func init() {
}

func initLogger() {
logger = *NewLogger(utils.VerbosityTypeFromString(globalOpts.Verbosity)).
var logLevel = globalOpts.LogLevel
var verbosity = globalOpts.Verbosity

if verbosity == true && logLevel == "" {
logLevel = "Info"
}

log = *NewLogger(utils.LogLevelFromString(logLevel)).
WithWriter(os.Stdout)

knoxite.SetLogger(log)
}

// initConfig initializes the configuration for knoxite.
Expand All @@ -111,19 +120,19 @@ func initLogger() {
func initConfig() {
// We dont allow both flags to be set as this can lead to unclear instructions.
if RootCmd.PersistentFlags().Changed("repo") && RootCmd.PersistentFlags().Changed("alias") {
logger.Fatalf("Specify either repository directory '-r' or an alias '-R'")
log.Fatalf("Specify either repository directory '-r' or an alias '-R'")
return
}

var err error
cfg, err = config.New(globalOpts.ConfigURL)
if err != nil {
logger.Fatalf("error reading the config file: %v", err)
log.Fatalf("error reading the config file: %v", err)
return
}

if err = cfg.Load(); err != nil {
logger.Fatalf("error parsing the toml config file at '%s': %v", cfg.URL().Path, err)
log.Fatalf("error parsing the toml config file at '%s': %v", cfg.URL().Path, err)
return
}

Expand All @@ -137,7 +146,7 @@ func initConfig() {
if globalOpts.Alias != "" {
rep, ok := cfg.Repositories[globalOpts.Alias]
if !ok {
logger.Fatalf("error loading the specified alias")
log.Fatalf("error loading the specified alias")
return
}

Expand Down
11 changes: 8 additions & 3 deletions cmd/knoxite/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,16 +193,21 @@ func PathToUrl(u string) (*url.URL, error) {
return url, nil
}

// VerbosityTypeFromString returns the verbosity type from a user-specified string.
func VerbosityTypeFromString(s string) knoxite.Verbosity {
// LogLevelFromString returns the log level from a user-specified string.
// returns log level print as default
func LogLevelFromString(s string) knoxite.LogLevel {
switch strings.ToLower(s) {
case "fatal":
return knoxite.LogLevelFatal
case "warning":
return knoxite.LogLevelWarning
case "print":
return knoxite.LogLevelPrint
case "info":
return knoxite.LogLevelInfo
case "debug":
return knoxite.LogLevelDebug
default:
return knoxite.LogLevelWarning
return knoxite.LogLevelPrint
}
}
7 changes: 6 additions & 1 deletion cmd/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,16 @@ import (
"errors"
"fmt"
"io"
"log"
"net/http"
"os"
"path/filepath"
"strings"

"github.com/knoxite/knoxite"
)

var (
log knoxite.Logger
)

const storagePath = "/tmp/knoxite.storage"
Expand Down
14 changes: 10 additions & 4 deletions logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ type Logger interface {
Fatalf(format string, v ...interface{})
Warn(v ...interface{})
Warnf(format string, v ...interface{})
Print(v ...interface{})
Printf(format string, v ...interface{})
Info(v ...interface{})
Infof(format string, v ...interface{})
Debug(v ...interface{})
Expand All @@ -31,18 +33,22 @@ func SetLogger(l Logger) {
type NopLogger struct {
}

func (nl NopLogger) Fatal(v ...interface{}) {}

func (nl NopLogger) Fatalf(format string, v ...interface{}) {}

func (nl NopLogger) Warn(v ...interface{}) {}

func (nl NopLogger) Warnf(format string, v ...interface{}) {}

func (nl NopLogger) Print(v ...interface{}) {}

func (nl NopLogger) Printf(format string, v ...interface{}) {}

func (nl NopLogger) Info(v ...interface{}) {}

func (nl NopLogger) Infof(format string, v ...interface{}) {}

func (nl NopLogger) Debug(v ...interface{}) {}

func (nl NopLogger) Debugf(format string, v ...interface{}) {}

func (nl NopLogger) Fatal(v ...interface{}) {}

func (nl NopLogger) Fatalf(format string, v ...interface{}) {}
5 changes: 4 additions & 1 deletion storage/http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"bytes"
"fmt"
"io/ioutil"
"log"
"mime/multipart"
"net/http"
"net/url"
Expand All @@ -25,6 +24,10 @@ type HTTPStorage struct {
URL url.URL
}

var (
log knoxite.Logger
)

func init() {
knoxite.RegisterStorageBackend(&HTTPStorage{})
}
Expand Down
9 changes: 5 additions & 4 deletions verbosity.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,17 @@

package knoxite

// verbosity levels for logging.
type Verbosity int
// log levels for logging.
type LogLevel int

const (
LogLevelFatal = iota
LogLevelWarning
LogLevelPrint
LogLevelInfo
LogLevelDebug
)

func (v Verbosity) String() string {
return [...]string{"Fatal", "Warning", "Info", "Debug"}[v]
func (v LogLevel) String() string {
return [...]string{"Fatal", "Warning", "Print", "Info", "Debug"}[v]
}

0 comments on commit 137c364

Please sign in to comment.