Skip to content

Commit

Permalink
feat: add logger
Browse files Browse the repository at this point in the history
  • Loading branch information
voocel committed May 29, 2022
1 parent 86c5949 commit 4ce158c
Show file tree
Hide file tree
Showing 5 changed files with 205 additions and 7 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
.idea
.vscode
test
sv
sv
bin
1 change: 1 addition & 0 deletions install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ case ":${PATH}:" in
;;
*)
export PATH="$HOME/.sv/go:$PATH"
export PATH="$HOME/.sv/bin:$PATH"
;;
esac
EOF
Expand Down
196 changes: 196 additions & 0 deletions logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
package main

import (
"fmt"
"io"
"log"
"os"
"runtime"
"strings"
"time"
)

var l *Logger

type writer struct {
io.Writer
timeFormat string
}

func (w writer) Write(b []byte) (n int, err error) {
return w.Writer.Write(append([]byte(time.Now().Format(w.timeFormat)), b...))
}

const (
red = "\033[0;31;1m"
yellow = "\033[0;33m"
white = "\033[0;37m"
cyan = "\033[0;36m"
blue = "\033[0;34;1m"
end = "\033[0m"
)

func init() {
l = New()
}

type Logger struct {
T, D, I, W, E *log.Logger
t, d, i, w, e bool
}

func New() (l *Logger) {
l = &Logger{
T: log.New(os.Stdout, "[trace]\t", log.Ltime|log.Lmicroseconds|log.Lshortfile),
D: log.New(os.Stdout, "[debug]\t", log.Ltime|log.Lshortfile),
I: log.New(os.Stdout, "[info]\t", log.Ldate|log.Ltime),
W: log.New(os.Stdout, "[warn]\t", log.Ldate|log.Ltime),
E: log.New(os.Stdout, "[error]\t", log.Ldate|log.Ltime|log.Lshortfile),
t: true,
d: true,
i: true,
w: true,
e: true,
}
if runtime.GOOS == "linux" {
l.T.SetPrefix(blue + l.T.Prefix() + end)
l.D.SetPrefix(cyan + l.D.Prefix() + end)
l.I.SetPrefix(white + l.I.Prefix() + end)
l.W.SetPrefix(yellow + l.W.Prefix() + end)
l.E.SetPrefix(red + l.E.Prefix() + end)
}
if strings.TrimSpace(strings.ToLower(os.Getenv("LOGGER"))) != "" {
l.SetLevel(strings.TrimSpace(strings.ToLower(os.Getenv("LOGGER"))))
}
return
}

func SetOutput(w io.Writer) {
l.SetOutput(w)
}

func SetLevel(s string) {
if strings.TrimSpace(strings.ToLower(os.Getenv("LOGGER"))) != "" {
return
}
l.SetLevel(s)
}

func (l *Logger) SetOutput(w io.Writer) {
l.T.SetOutput(w)
l.D.SetOutput(w)
l.I.SetOutput(w)
l.W.SetOutput(w)
l.E.SetOutput(w)
}

func (l *Logger) SetLevel(s string) {
l.t = true
l.d = true
l.i = true
l.w = true
l.e = true
switch s {
case "debug":
l.t = false
case "info":
l.t = false
l.d = false
case "warn":
l.t = false
l.d = false
l.i = false
case "error":
l.t = false
l.d = false
l.i = false
l.w = false
}
}

func GetLevel() (s string) {
return l.GetLevel()
}

func (l *Logger) GetLevel() (s string) {
if l.t {
return "trace"
} else if l.d {
return "debug"
} else if l.i {
return "info"
} else if l.w {
return "warn"
}
return "error"
}

func Tracef(format string, v ...interface{}) {
l.Tracef(format, v...)
}

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

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

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

func Errorf(format string, v ...interface{}) {
l.Errorf(format, v...)
}

func Trace(v ...interface{}) {
l.Tracef(fmt.Sprint(v...))
}

func Debug(v ...interface{}) {
l.Debugf(fmt.Sprint(v...))
}

func Info(v ...interface{}) {
l.Infof(fmt.Sprint(v...))
}

func Warn(v ...interface{}) {
l.Warnf(fmt.Sprint(v...))
}

func Error(v ...interface{}) {
l.Errorf(fmt.Sprint(v...))
}

func (l *Logger) Tracef(format string, v ...interface{}) {
if l.t {
l.T.Output(3, fmt.Sprintf(format, v...))
}
}

func (l *Logger) Debugf(format string, v ...interface{}) {
if l.d {
l.D.Output(3, fmt.Sprintf(format, v...))
}
}

func (l *Logger) Infof(format string, v ...interface{}) {
if l.i {
l.I.Output(3, fmt.Sprintf(format, v...))
}
}

func (l *Logger) Warnf(format string, v ...interface{}) {
if l.w {
l.W.Output(3, fmt.Sprintf(format, v...))
}
}

func (l *Logger) Errorf(format string, v ...interface{}) {
if l.e {
l.E.Output(3, fmt.Sprintf(format, v...))
}
}
5 changes: 3 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@ var (
svDownload string
)

const Ver = "v1.0.0"
const Ver = "v1.0.2"

func main() {
l.SetLevel("debug")
app := cli.NewApp()
app.Usage = "switch version"
app.Version = Ver
app.EnableBashCompletion = true
app.CustomAppHelpTemplate = "add sv to your ~/.bashrc or ~/.zshrc. export PATH=\"$HOME/.sv/bin:$PATH\""
//app.CustomAppHelpTemplate = "add sv to your ~/.bashrc or ~/.zshrc. export PATH=\"$HOME/.sv/bin:$PATH\""
//app.Action = baseCmd
app.Commands = []*cli.Command{
{
Expand Down
7 changes: 3 additions & 4 deletions upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package main
import (
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"os"
Expand Down Expand Up @@ -35,7 +34,7 @@ func NewUpgrade() *Upgrade {
}

func (u *Upgrade) checkUpgrade() error {
fmt.Println("check version...")
Info("check version...")
resp, err := http.Get(upgradeApi)
if err != nil {
return err
Expand All @@ -59,7 +58,7 @@ func (u *Upgrade) upgrade() error {
filename := filepath.Base(u.downloadURL)
path := filepath.Join(svBin, filename)

fmt.Println("downloading the newest version...")
Info("downloading the newest version...")
resp, err := http.Get(u.downloadURL)
if err != nil {
return err
Expand All @@ -76,6 +75,6 @@ func (u *Upgrade) upgrade() error {
return err
}

fmt.Println("upgrade success!")
Info("upgrade success!")
return os.Rename(filepath.Join(svBin, filename), filepath.Join(svBin, "sv"))
}

0 comments on commit 4ce158c

Please sign in to comment.