// Copyright (c) 2014-2018, b3log.org & hacpai.com // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package log includes logging related manipulations. // // log.SetLevel("debug") // logger := log.NewLogger(os.Stdout) // // logger.Trace("trace message) // logger.Debug("debug message") // logger.Info("info message") // logger.Warn("warning message") // logger.Error("error message") // // logger.Errorf("formatted %s message", "error") package log import ( "fmt" "io" stdlog "log" "strings" ) // Logging level. const ( Off = iota Trace Debug Info Warn Error ) // all loggers. var loggers []*Logger // the global default logging level, it will be used for creating logger. var logLevel = Debug // Logger represents a simple logger with level. // The underlying logger is the standard Go logging "log". type Logger struct { level int logger *stdlog.Logger } // NewLogger creates a logger. func NewLogger(out io.Writer) *Logger { ret := &Logger{level: logLevel, logger: stdlog.New(out, "", stdlog.Ldate|stdlog.Ltime|stdlog.Lshortfile)} loggers = append(loggers, ret) return ret } // SetLevel sets the logging level of all loggers. func SetLevel(level string) { logLevel = getLevel(level) for _, l := range loggers { l.SetLevel(level) } } // getLevel gets logging level int value corresponding to the specified level. func getLevel(level string) int { level = strings.ToLower(level) switch level { case "off": return Off case "trace": return Trace case "debug": return Debug case "info": return Info case "warn": return Warn case "error": return Error default: return Info } } // SetLevel sets the logging level of a logger. func (l *Logger) SetLevel(level string) { l.level = getLevel(level) } // IsTraceEnabled determines whether the trace level is enabled. func (l *Logger) IsTraceEnabled() bool { return l.level <= Trace } // IsDebugEnabled determines whether the debug level is enabled. func (l *Logger) IsDebugEnabled() bool { return l.level <= Debug } // IsWarnEnabled determines whether the debug level is enabled. func (l *Logger) IsWarnEnabled() bool { return l.level <= Warn } // Trace prints trace level message. func (l *Logger) Trace(v ...interface{}) { if Trace < l.level { return } l.logger.SetPrefix("T ") l.logger.Output(2, fmt.Sprint(v...)) } // Tracef prints trace level message with format. func (l *Logger) Tracef(format string, v ...interface{}) { if Trace < l.level { return } l.logger.SetPrefix("T ") l.logger.Output(2, fmt.Sprintf(format, v...)) } // Debug prints debug level message. func (l *Logger) Debug(v ...interface{}) { if Debug < l.level { return } l.logger.SetPrefix("D ") l.logger.Output(2, fmt.Sprint(v...)) } // Debugf prints debug level message with format. func (l *Logger) Debugf(format string, v ...interface{}) { if Debug < l.level { return } l.logger.SetPrefix("D ") l.logger.Output(2, fmt.Sprintf(format, v...)) } // Info prints info level message. func (l *Logger) Info(v ...interface{}) { if Info < l.level { return } l.logger.SetPrefix("I ") l.logger.Output(2, fmt.Sprint(v...)) } // Infof prints info level message with format. func (l *Logger) Infof(format string, v ...interface{}) { if Info < l.level { return } l.logger.SetPrefix("I ") l.logger.Output(2, fmt.Sprintf(format, v...)) } // Warn prints warning level message. func (l *Logger) Warn(v ...interface{}) { if Warn < l.level { return } l.logger.SetPrefix("W ") l.logger.Output(2, fmt.Sprint(v...)) } // Warn prints warning level message with format. func (l *Logger) Warnf(format string, v ...interface{}) { if Warn < l.level { return } l.logger.SetPrefix("W ") l.logger.Output(2, fmt.Sprintf(format, v...)) } // Error prints error level message. func (l *Logger) Error(v ...interface{}) { if Error < l.level { return } l.logger.SetPrefix("E ") l.logger.Output(2, fmt.Sprint(v...)) } // Errorf prints error level message with format. func (l *Logger) Errorf(format string, v ...interface{}) { if Error < l.level { return } l.logger.SetPrefix("E ") l.logger.Output(2, fmt.Sprintf(format, v...)) }