diff --git a/logger.go b/logger.go index dc24dc1..254be91 100644 --- a/logger.go +++ b/logger.go @@ -1,39 +1,32 @@ package log -import ( - "fmt" - "io" -) +type Logger interface { + Alert(a ...interface{}) + Alertf(format string, a ...interface{}) -type Logger struct { - Writer io.Writer -} + Error(a ...interface{}) + Errorf(format string, a ...interface{}) -func (l Logger) Log(s ...interface{}) { - if l.Writer == nil { - return - } - fmt.Fprintln(l.Writer, s...) -} + Highlight(a ...interface{}) + Highlightf(format string, a ...interface{}) -func (l Logger) Logf(format string, s ...interface{}) { - if l.Writer == nil { - return - } - format = fmt.Sprintf("%s%s", format, "\n") - fmt.Fprintf(l.Writer, format, s...) -} + Inform(a ...interface{}) + Informf(format string, a ...interface{}) -func (l Logger) Begin(s ...interface{}) { - var p []interface{} = append([]interface{}{"BEGIN "}, s...) - l.Log(p...) -} + Log(a ...interface{}) + Logf(format string, a ...interface{}) -func (l Logger) End(s ...interface{}) { - var p []interface{} = append([]interface{}{"END "}, s...) - l.Log(p...) -} + Trace(a ...interface{}) + Tracef(format string, a ...interface{}) -func (l Logger) Error(s string, err error) { - l.Log(s, err) + Warn(a ...interface{}) + Warnf(format string, a ...interface{}) + + Prefix(...string) Logger + + Begin(a ...interface{}) Logger + + End(a ...interface{}) + + Level(uint8) Logger } diff --git a/logger_alert.go b/logger_alert.go new file mode 100644 index 0000000..291b54e --- /dev/null +++ b/logger_alert.go @@ -0,0 +1,21 @@ +package log + +func (l myLogger) Alert(a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, alertFlag) { + return + } + l.log(a...) +} + +func (l myLogger) Alertf(format string, a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, alertFlag) { + return + } + l.logf(format, a...) +} diff --git a/logger_begin.go b/logger_begin.go new file mode 100644 index 0000000..8d285cd --- /dev/null +++ b/logger_begin.go @@ -0,0 +1,9 @@ +package log + +import "time" + +func (l myLogger) Begin(s ...interface{}) Logger { + logger := myLogger{Writer: l.Writer, prefix: l.prefix, begin: time.Now(), level: l.level} + l.log(append([]interface{}{"BEGIN"}, s...)...) + return logger +} diff --git a/logger_end.go b/logger_end.go new file mode 100644 index 0000000..5b0a561 --- /dev/null +++ b/logger_end.go @@ -0,0 +1,11 @@ +package log + +import ( + "fmt" + "time" +) + +func (l myLogger) End(s ...interface{}) { + var p []interface{} = append([]interface{}{fmt.Sprintf("END δt=%dµs", time.Now().Sub(l.begin)/1000)}, s...) + l.log(p...) +} diff --git a/logger_error.go b/logger_error.go new file mode 100644 index 0000000..f8afd49 --- /dev/null +++ b/logger_error.go @@ -0,0 +1,21 @@ +package log + +func (l myLogger) Error(a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, errorFlag) { + return + } + l.log(a...) +} + +func (l myLogger) Errorf(format string, a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, errorFlag) { + return + } + l.logf(format, a...) +} diff --git a/logger_highlight.go b/logger_highlight.go new file mode 100644 index 0000000..c5de39e --- /dev/null +++ b/logger_highlight.go @@ -0,0 +1,21 @@ +package log + +func (l myLogger) Highlight(a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, highlightFlag) { + return + } + l.log(a...) +} + +func (l myLogger) Highlightf(format string, a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, highlightFlag) { + return + } + l.logf(format, a...) +} diff --git a/logger_inform.go b/logger_inform.go new file mode 100644 index 0000000..f6515d9 --- /dev/null +++ b/logger_inform.go @@ -0,0 +1,21 @@ +package log + +func (l myLogger) Inform(a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, informFlag) { + return + } + l.log(a...) +} + +func (l myLogger) Informf(format string, a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, informFlag) { + return + } + l.logf(format, a...) +} diff --git a/logger_level.go b/logger_level.go new file mode 100644 index 0000000..c77d8e6 --- /dev/null +++ b/logger_level.go @@ -0,0 +1,34 @@ +package log + +const ( + alertFlag = 0b00000001 // L1 + errorFlag = 0b00000001 // L1 + warnFlag = 0b00000010 // L2 + highlightFlag = 0b00000100 // L3 + informFlag = 0b00001000 // L4 + logFlag = 0b00010000 // L5 + traceFlag = 0b00100000 // L6 +) + +func (l myLogger) Level(level uint8) Logger { + logger := myLogger{Writer: l.Writer, prefix: l.prefix, begin: l.begin} + switch level { + case 1: + logger.level = alertFlag | errorFlag + case 2: + logger.level = alertFlag | errorFlag | warnFlag + case 3: + logger.level = alertFlag | errorFlag | warnFlag | highlightFlag + case 4: + logger.level = alertFlag | errorFlag | warnFlag | highlightFlag | informFlag + case 5: + logger.level = alertFlag | errorFlag | warnFlag | highlightFlag | informFlag | logFlag + default: + logger.level = alertFlag | errorFlag | warnFlag | highlightFlag | informFlag | logFlag | traceFlag + } + return logger +} + +func hasLevel(b uint8, flag uint8) bool { + return b&flag != 0 +} diff --git a/logger_log.go b/logger_log.go new file mode 100644 index 0000000..edb9ad4 --- /dev/null +++ b/logger_log.go @@ -0,0 +1,21 @@ +package log + +func (l myLogger) Log(s ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, logFlag) { + return + } + l.log(s...) +} + +func (l myLogger) Logf(format string, s ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, logFlag) { + return + } + l.logf(format, s...) +} diff --git a/logger_prefix.go b/logger_prefix.go new file mode 100644 index 0000000..ef68ee7 --- /dev/null +++ b/logger_prefix.go @@ -0,0 +1,16 @@ +package log + +import ( + "fmt" + "strings" +) + +func (l myLogger) Prefix(p ...string) Logger { + var buffer strings.Builder + buffer.WriteString(l.prefix) + for _, prefix := range p { + buffer.WriteString(fmt.Sprintf("%s: ", prefix)) + } + logger := myLogger{Writer: l.Writer, prefix: buffer.String()} + return logger +} diff --git a/logger_trace.go b/logger_trace.go new file mode 100644 index 0000000..11cab71 --- /dev/null +++ b/logger_trace.go @@ -0,0 +1,21 @@ +package log + +func (l myLogger) Trace(a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, traceFlag) { + return + } + l.log(a...) +} + +func (l myLogger) Tracef(format string, a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, traceFlag) { + return + } + l.logf(format, a...) +} diff --git a/logger_warn.go b/logger_warn.go new file mode 100644 index 0000000..7cd5088 --- /dev/null +++ b/logger_warn.go @@ -0,0 +1,21 @@ +package log + +func (l myLogger) Warn(a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, warnFlag) { + return + } + l.log(a...) +} + +func (l myLogger) Warnf(format string, a ...interface{}) { + if l.Writer == nil { + return + } + if !hasLevel(l.level, warnFlag) { + return + } + l.logf(format, a...) +} diff --git a/my_logger.go b/my_logger.go new file mode 100644 index 0000000..2fc1007 --- /dev/null +++ b/my_logger.go @@ -0,0 +1,53 @@ +package log + +import ( + "fmt" + "io" + "os" + "runtime" + "strings" + "time" +) + +type myLogger struct { + Writer io.Writer + prefix string + begin time.Time + level uint8 +} + +func (l myLogger) log(s ...interface{}) { + if l.Writer == nil { + return + } + s = append([]interface{}{l.prefix, funcName()}, s...) + fmt.Fprintln(l.Writer, s...) +} + +func (l myLogger) logf(format string, s ...interface{}) { + if l.Writer == nil { + return + } + format = fmt.Sprintf("%s %s %s\n", l.prefix, funcName(), format) + fmt.Fprintf(l.Writer, format, s...) +} + +func funcName() string { + pc := make([]uintptr, 10) + runtime.Callers(2, pc) + for _, p := range pc { + fn := runtime.FuncForPC(p) + if !strings.HasPrefix(fn.Name(), "github.com/rjbasitali/go-log") { + return fn.Name() + } + } + return "" +} + +func NewLogger() Logger { + return myLogger{ + Writer: os.Stdout, + begin: time.Now(), + level: 63, + } +}