OSDN Git Service

add package
[bytom/vapor.git] / vendor / github.com / hashicorp / go-hclog / log.go
diff --git a/vendor/github.com/hashicorp/go-hclog/log.go b/vendor/github.com/hashicorp/go-hclog/log.go
new file mode 100644 (file)
index 0000000..894e846
--- /dev/null
@@ -0,0 +1,161 @@
+package hclog
+
+import (
+       "io"
+       "log"
+       "os"
+       "strings"
+       "sync"
+)
+
+var (
+       DefaultOutput = os.Stderr
+       DefaultLevel  = Info
+)
+
+type Level int32
+
+const (
+       // This is a special level used to indicate that no level has been
+       // set and allow for a default to be used.
+       NoLevel Level = 0
+
+       // The most verbose level. Intended to be used for the tracing of actions
+       // in code, such as function enters/exits, etc.
+       Trace Level = 1
+
+       // For programmer lowlevel analysis.
+       Debug Level = 2
+
+       // For information about steady state operations.
+       Info Level = 3
+
+       // For information about rare but handled events.
+       Warn Level = 4
+
+       // For information about unrecoverable events.
+       Error Level = 5
+)
+
+// When processing a value of this type, the logger automatically treats the first
+// argument as a Printf formatting string and passes the rest as the values to be
+// formatted. For example: L.Info(Fmt{"%d beans/day", beans}). This is a simple
+// convience type for when formatting is required.
+type Format []interface{}
+
+// Fmt returns a Format type. This is a convience function for creating a Format
+// type.
+func Fmt(str string, args ...interface{}) Format {
+       return append(Format{str}, args...)
+}
+
+// LevelFromString returns a Level type for the named log level, or "NoLevel" if
+// the level string is invalid. This facilitates setting the log level via
+// config or environment variable by name in a predictable way.
+func LevelFromString(levelStr string) Level {
+       // We don't care about case. Accept "INFO" or "info"
+       levelStr = strings.ToLower(strings.TrimSpace(levelStr))
+       switch levelStr {
+       case "trace":
+               return Trace
+       case "debug":
+               return Debug
+       case "info":
+               return Info
+       case "warn":
+               return Warn
+       case "error":
+               return Error
+       default:
+               return NoLevel
+       }
+}
+
+// The main Logger interface. All code should code against this interface only.
+type Logger interface {
+       // Args are alternating key, val pairs
+       // keys must be strings
+       // vals can be any type, but display is implementation specific
+       // Emit a message and key/value pairs at the TRACE level
+       Trace(msg string, args ...interface{})
+
+       // Emit a message and key/value pairs at the DEBUG level
+       Debug(msg string, args ...interface{})
+
+       // Emit a message and key/value pairs at the INFO level
+       Info(msg string, args ...interface{})
+
+       // Emit a message and key/value pairs at the WARN level
+       Warn(msg string, args ...interface{})
+
+       // Emit a message and key/value pairs at the ERROR level
+       Error(msg string, args ...interface{})
+
+       // Indicate if TRACE logs would be emitted. This and the other Is* guards
+       // are used to elide expensive logging code based on the current level.
+       IsTrace() bool
+
+       // Indicate if DEBUG logs would be emitted. This and the other Is* guards
+       IsDebug() bool
+
+       // Indicate if INFO logs would be emitted. This and the other Is* guards
+       IsInfo() bool
+
+       // Indicate if WARN logs would be emitted. This and the other Is* guards
+       IsWarn() bool
+
+       // Indicate if ERROR logs would be emitted. This and the other Is* guards
+       IsError() bool
+
+       // Creates a sublogger that will always have the given key/value pairs
+       With(args ...interface{}) Logger
+
+       // Create a logger that will prepend the name string on the front of all messages.
+       // If the logger already has a name, the new value will be appended to the current
+       // name. That way, a major subsystem can use this to decorate all it's own logs
+       // without losing context.
+       Named(name string) Logger
+
+       // Create a logger that will prepend the name string on the front of all messages.
+       // This sets the name of the logger to the value directly, unlike Named which honor
+       // the current name as well.
+       ResetNamed(name string) Logger
+
+       // Updates the level. This should affect all sub-loggers as well. If an
+       // implementation cannot update the level on the fly, it should no-op.
+       SetLevel(level Level)
+
+       // Return a value that conforms to the stdlib log.Logger interface
+       StandardLogger(opts *StandardLoggerOptions) *log.Logger
+}
+
+type StandardLoggerOptions struct {
+       // Indicate that some minimal parsing should be done on strings to try
+       // and detect their level and re-emit them.
+       // This supports the strings like [ERROR], [ERR] [TRACE], [WARN], [INFO],
+       // [DEBUG] and strip it off before reapplying it.
+       InferLevels bool
+}
+
+type LoggerOptions struct {
+       // Name of the subsystem to prefix logs with
+       Name string
+
+       // The threshold for the logger. Anything less severe is supressed
+       Level Level
+
+       // Where to write the logs to. Defaults to os.Stdout if nil
+       Output io.Writer
+
+       // An optional mutex pointer in case Output is shared
+       Mutex *sync.Mutex
+
+       // Control if the output should be in JSON.
+       JSONFormat bool
+
+       // Include file and line information in each log line
+       IncludeLocation bool
+
+       // The time format to use instead of the default
+       TimeFormat string
+}