2015-01-18 08:59:10 +03:00
|
|
|
// Copyright (c) 2014-2015, b3log.org
|
2014-12-12 11:50:59 +03:00
|
|
|
//
|
|
|
|
// 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
|
|
|
|
//
|
|
|
|
// http://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.
|
|
|
|
//
|
2015-01-08 12:16:36 +03:00
|
|
|
// log.SetLevel("debug")
|
2014-12-13 13:47:41 +03:00
|
|
|
// logger := log.NewLogger(os.Stdout)
|
2014-12-12 11:50:59 +03:00
|
|
|
//
|
2014-12-14 18:16:11 +03:00
|
|
|
// logger.Trace("trace message)
|
2014-12-12 11:50:59 +03:00
|
|
|
// 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"
|
2014-12-13 13:47:41 +03:00
|
|
|
"strings"
|
2014-12-12 11:50:59 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
// Logging level.
|
|
|
|
const (
|
2014-12-21 06:06:10 +03:00
|
|
|
Off = iota
|
|
|
|
Trace
|
2014-12-14 18:16:11 +03:00
|
|
|
Debug
|
2014-12-12 11:50:59 +03:00
|
|
|
Info
|
|
|
|
Warn
|
|
|
|
Error
|
|
|
|
)
|
|
|
|
|
2014-12-13 13:47:41 +03:00
|
|
|
// 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".
|
2014-12-12 11:50:59 +03:00
|
|
|
type Logger struct {
|
|
|
|
level int
|
|
|
|
logger *stdlog.Logger
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewLogger creates a logger.
|
2014-12-13 13:47:41 +03:00
|
|
|
func NewLogger(out io.Writer) *Logger {
|
|
|
|
ret := &Logger{level: logLevel, logger: stdlog.New(out, "", stdlog.Ldate|stdlog.Ltime|stdlog.Lshortfile)}
|
|
|
|
|
|
|
|
loggers = append(loggers, ret)
|
2014-12-12 11:50:59 +03:00
|
|
|
|
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
2014-12-13 13:47:41 +03:00
|
|
|
// 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 {
|
2014-12-21 06:06:10 +03:00
|
|
|
case "off":
|
|
|
|
return Off
|
2014-12-14 18:16:11 +03:00
|
|
|
case "trace":
|
|
|
|
return Trace
|
2014-12-13 13:47:41 +03:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
2014-12-21 06:06:10 +03:00
|
|
|
// 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
|
|
|
|
}
|
|
|
|
|
2014-12-14 18:05:54 +03:00
|
|
|
// Trace prints trace level message.
|
|
|
|
func (l *Logger) Trace(v ...interface{}) {
|
2014-12-14 18:16:11 +03:00
|
|
|
if Trace < l.level {
|
2014-12-14 18:05:54 +03:00
|
|
|
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{}) {
|
2014-12-14 18:16:11 +03:00
|
|
|
if Trace < l.level {
|
2014-12-14 18:05:54 +03:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
l.logger.SetPrefix("T ")
|
|
|
|
l.logger.Output(2, fmt.Sprintf(format, v...))
|
|
|
|
}
|
|
|
|
|
2014-12-12 11:50:59 +03:00
|
|
|
// 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...))
|
|
|
|
}
|