From fdfb2bc4c1ec6b7b7de37a6124269e28157d494e Mon Sep 17 00:00:00 2001 From: Shu xian Date: Fri, 7 Feb 2020 05:35:46 +0800 Subject: [PATCH] [WIP] logger first (#1161) * logger first * log->logger * update comment * add context in Options * add Fields * remove logfi * add field encode * add common Field Types * update logger field --- logger/field.go | 43 ++++++++++++++++++++++++++++++++++++++++++ logger/level.go | 13 +++++++++++++ logger/logger.go | 48 +++++++++++++++++++++++++++++++++++++++++++++++ logger/options.go | 19 +++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 logger/field.go create mode 100644 logger/level.go create mode 100644 logger/logger.go create mode 100644 logger/options.go diff --git a/logger/field.go b/logger/field.go new file mode 100644 index 00000000..a91572ac --- /dev/null +++ b/logger/field.go @@ -0,0 +1,43 @@ +package logger + +type FieldType uint8 + +type Encode func(*Field) string + +type Field struct { + Key string + Type FieldType + Value interface{} + Encode Encode +} + +func (f *Field) GetValue() interface{} { + if f.Encode != nil { + return f.Encode(f) + } + + return f.Value +} + +// preset common types for choosing encoder faster +const ( + UnknownType FieldType = iota + BoolType + DurationType + Float64Type + Float32Type + Int64Type + Int32Type + Int16Type + Int8Type + Uint64Type + Uint32Type + Uint16Type + Uint8Type + StringType + TimeType +) + +func Bool(key string, val bool) Field { + return Field{Key: key, Type: BoolType, Value: val} +} diff --git a/logger/level.go b/logger/level.go new file mode 100644 index 00000000..d7a345be --- /dev/null +++ b/logger/level.go @@ -0,0 +1,13 @@ +package logger + +type Level int8 + +const ( + TraceLevel Level = iota - 1 + DebugLevel + InfoLevel + WarnLevel + ErrorLevel + PanicLevel + FatalLevel +) diff --git a/logger/logger.go b/logger/logger.go new file mode 100644 index 00000000..001bb2b1 --- /dev/null +++ b/logger/logger.go @@ -0,0 +1,48 @@ +// Package log provides a log interface +package logger + +import ( + "fmt" + "sync" +) + +// Logger is a generic logging interface +type Logger interface { + Init(options ...Option) error + // String returns the name of logger + String() string + // SetLevel updates the logging level. + SetLevel(Level) + // Level returns the logging level + Level() Level + // Log inserts a log entry. Arguments may be handled in the manner + // of fmt.Print, but the underlying logger may also decide to handle + // them differently. + Log(level Level, v ...interface{}) + // Logf insets a log entry. Arguments are handled in the manner of + // fmt.Printf. + Logf(level Level, format string, v ...interface{}) + // Fields set fields to always be logged + Fields(fields ...Field) Logger +} + +var ( + mux sync.Mutex + loggerMap = map[string]Logger{} +) + +func Register(logger Logger) { + mux.Lock() + defer mux.Unlock() + + loggerMap[logger.String()] = logger +} + +func GetLogger(name string) (Logger, error) { + l := loggerMap[name] + if l == nil { + return nil, fmt.Errorf("no such name logger found %s", name) + } + + return l, nil +} diff --git a/logger/options.go b/logger/options.go new file mode 100644 index 00000000..ca502f7c --- /dev/null +++ b/logger/options.go @@ -0,0 +1,19 @@ +package logger + +import "context" + +// Option for load profiles maybe +// eg. yml +// micro: +// logger: +// name: +// dialect: zap/default/logrus +// zap: +// xxx: +// logrus: +// xxx: +type Option func(*Options) + +type Options struct { + Context context.Context +}