package logawl import ( "fmt" "io" "sync" "sync/atomic" ) type Level int32 type Logger struct { Mu sync.Mutex Level Level Prefix string Out io.Writer buf []byte isDiscard int32 } // Stores whatever input value is in mem address of l.level func (l *Logger) SetLevel(level Level) { atomic.StoreInt32((*int32)(&l.Level), int32(level)) } // Mostly nothing func (l *Logger) GetLevel() Level { return l.level() } // Retrieves whatever was stored in mem address of l.level func (l *Logger) level() Level { return Level(atomic.LoadInt32((*int32)(&l.Level))) } // Unmarshalls the int value of level for writing the header func (l *Logger) UnMarshalLevel(lv Level) (string, error) { switch lv { case 0: return "fatal: ", nil case 1: return "error: ", nil case 2: return "info: ", nil case 3: return "debug: ", nil } return "", fmt.Errorf("Invalid log level choice") } func (l *Logger) IsLevel(level Level) bool { return l.level() >= level } var AllLevels = []Level{ FatalLevel, ErrorLevel, InfoLevel, DebugLevel, } const ( // Fatal logs (will call exit(1)) FatalLevel Level = iota // Error logs ErrorLevel // What is going on level InfoLevel // Verbose log level. DebugLevel )