]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blame - vendor/github.com/hashicorp/go-hclog/log.go
Upgrade to 0.12
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / hashicorp / go-hclog / log.go
CommitLineData
15c0b25d
AP
1package hclog
2
3import (
4 "io"
5 "log"
6 "os"
7 "strings"
107c1cdb 8 "sync"
15c0b25d
AP
9)
10
11var (
12 DefaultOutput = os.Stderr
13 DefaultLevel = Info
14)
15
107c1cdb 16type Level int32
15c0b25d
AP
17
18const (
19 // This is a special level used to indicate that no level has been
20 // set and allow for a default to be used.
21 NoLevel Level = 0
22
23 // The most verbose level. Intended to be used for the tracing of actions
24 // in code, such as function enters/exits, etc.
25 Trace Level = 1
26
27 // For programmer lowlevel analysis.
28 Debug Level = 2
29
30 // For information about steady state operations.
31 Info Level = 3
32
33 // For information about rare but handled events.
34 Warn Level = 4
35
36 // For information about unrecoverable events.
37 Error Level = 5
38)
39
107c1cdb
ND
40// When processing a value of this type, the logger automatically treats the first
41// argument as a Printf formatting string and passes the rest as the values to be
42// formatted. For example: L.Info(Fmt{"%d beans/day", beans}). This is a simple
43// convience type for when formatting is required.
44type Format []interface{}
45
46// Fmt returns a Format type. This is a convience function for creating a Format
47// type.
48func Fmt(str string, args ...interface{}) Format {
49 return append(Format{str}, args...)
50}
51
15c0b25d
AP
52// LevelFromString returns a Level type for the named log level, or "NoLevel" if
53// the level string is invalid. This facilitates setting the log level via
54// config or environment variable by name in a predictable way.
55func LevelFromString(levelStr string) Level {
56 // We don't care about case. Accept "INFO" or "info"
57 levelStr = strings.ToLower(strings.TrimSpace(levelStr))
58 switch levelStr {
59 case "trace":
60 return Trace
61 case "debug":
62 return Debug
63 case "info":
64 return Info
65 case "warn":
66 return Warn
67 case "error":
68 return Error
69 default:
70 return NoLevel
71 }
72}
73
74// The main Logger interface. All code should code against this interface only.
75type Logger interface {
76 // Args are alternating key, val pairs
77 // keys must be strings
78 // vals can be any type, but display is implementation specific
79 // Emit a message and key/value pairs at the TRACE level
80 Trace(msg string, args ...interface{})
81
82 // Emit a message and key/value pairs at the DEBUG level
83 Debug(msg string, args ...interface{})
84
85 // Emit a message and key/value pairs at the INFO level
86 Info(msg string, args ...interface{})
87
88 // Emit a message and key/value pairs at the WARN level
89 Warn(msg string, args ...interface{})
90
91 // Emit a message and key/value pairs at the ERROR level
92 Error(msg string, args ...interface{})
93
94 // Indicate if TRACE logs would be emitted. This and the other Is* guards
95 // are used to elide expensive logging code based on the current level.
96 IsTrace() bool
97
98 // Indicate if DEBUG logs would be emitted. This and the other Is* guards
99 IsDebug() bool
100
101 // Indicate if INFO logs would be emitted. This and the other Is* guards
102 IsInfo() bool
103
104 // Indicate if WARN logs would be emitted. This and the other Is* guards
105 IsWarn() bool
106
107 // Indicate if ERROR logs would be emitted. This and the other Is* guards
108 IsError() bool
109
110 // Creates a sublogger that will always have the given key/value pairs
111 With(args ...interface{}) Logger
112
113 // Create a logger that will prepend the name string on the front of all messages.
114 // If the logger already has a name, the new value will be appended to the current
115 // name. That way, a major subsystem can use this to decorate all it's own logs
116 // without losing context.
117 Named(name string) Logger
118
119 // Create a logger that will prepend the name string on the front of all messages.
120 // This sets the name of the logger to the value directly, unlike Named which honor
121 // the current name as well.
122 ResetNamed(name string) Logger
123
107c1cdb
ND
124 // Updates the level. This should affect all sub-loggers as well. If an
125 // implementation cannot update the level on the fly, it should no-op.
126 SetLevel(level Level)
127
15c0b25d
AP
128 // Return a value that conforms to the stdlib log.Logger interface
129 StandardLogger(opts *StandardLoggerOptions) *log.Logger
130}
131
132type StandardLoggerOptions struct {
133 // Indicate that some minimal parsing should be done on strings to try
134 // and detect their level and re-emit them.
135 // This supports the strings like [ERROR], [ERR] [TRACE], [WARN], [INFO],
136 // [DEBUG] and strip it off before reapplying it.
137 InferLevels bool
138}
139
140type LoggerOptions struct {
141 // Name of the subsystem to prefix logs with
142 Name string
143
144 // The threshold for the logger. Anything less severe is supressed
145 Level Level
146
107c1cdb 147 // Where to write the logs to. Defaults to os.Stderr if nil
15c0b25d
AP
148 Output io.Writer
149
107c1cdb
ND
150 // An optional mutex pointer in case Output is shared
151 Mutex *sync.Mutex
152
15c0b25d
AP
153 // Control if the output should be in JSON.
154 JSONFormat bool
155
107c1cdb 156 // Include file and line information in each log line
15c0b25d 157 IncludeLocation bool
107c1cdb
ND
158
159 // The time format to use instead of the default
160 TimeFormat string
15c0b25d 161}