diff options
author | Jake Champlin <jake.champlin.27@gmail.com> | 2017-06-06 12:40:07 -0400 |
---|---|---|
committer | Jake Champlin <jake.champlin.27@gmail.com> | 2017-06-06 12:40:07 -0400 |
commit | bae9f6d2fd5eb5bc80929bd393932b23f14d7c93 (patch) | |
tree | ca9ab12a7d78b1fc27a8f734729081357ce6d252 /vendor/github.com/hashicorp/logutils/level.go | |
parent | 254c495b6bebab3fb72a243c4bce858d79e6ee99 (diff) | |
download | terraform-provider-statuscake-bae9f6d2fd5eb5bc80929bd393932b23f14d7c93.tar.gz terraform-provider-statuscake-bae9f6d2fd5eb5bc80929bd393932b23f14d7c93.tar.zst terraform-provider-statuscake-bae9f6d2fd5eb5bc80929bd393932b23f14d7c93.zip |
Initial transfer of provider code
Diffstat (limited to 'vendor/github.com/hashicorp/logutils/level.go')
-rw-r--r-- | vendor/github.com/hashicorp/logutils/level.go | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/logutils/level.go b/vendor/github.com/hashicorp/logutils/level.go new file mode 100644 index 0000000..6381bf1 --- /dev/null +++ b/vendor/github.com/hashicorp/logutils/level.go | |||
@@ -0,0 +1,81 @@ | |||
1 | // Package logutils augments the standard log package with levels. | ||
2 | package logutils | ||
3 | |||
4 | import ( | ||
5 | "bytes" | ||
6 | "io" | ||
7 | "sync" | ||
8 | ) | ||
9 | |||
10 | type LogLevel string | ||
11 | |||
12 | // LevelFilter is an io.Writer that can be used with a logger that | ||
13 | // will filter out log messages that aren't at least a certain level. | ||
14 | // | ||
15 | // Once the filter is in use somewhere, it is not safe to modify | ||
16 | // the structure. | ||
17 | type LevelFilter struct { | ||
18 | // Levels is the list of log levels, in increasing order of | ||
19 | // severity. Example might be: {"DEBUG", "WARN", "ERROR"}. | ||
20 | Levels []LogLevel | ||
21 | |||
22 | // MinLevel is the minimum level allowed through | ||
23 | MinLevel LogLevel | ||
24 | |||
25 | // The underlying io.Writer where log messages that pass the filter | ||
26 | // will be set. | ||
27 | Writer io.Writer | ||
28 | |||
29 | badLevels map[LogLevel]struct{} | ||
30 | once sync.Once | ||
31 | } | ||
32 | |||
33 | // Check will check a given line if it would be included in the level | ||
34 | // filter. | ||
35 | func (f *LevelFilter) Check(line []byte) bool { | ||
36 | f.once.Do(f.init) | ||
37 | |||
38 | // Check for a log level | ||
39 | var level LogLevel | ||
40 | x := bytes.IndexByte(line, '[') | ||
41 | if x >= 0 { | ||
42 | y := bytes.IndexByte(line[x:], ']') | ||
43 | if y >= 0 { | ||
44 | level = LogLevel(line[x+1 : x+y]) | ||
45 | } | ||
46 | } | ||
47 | |||
48 | _, ok := f.badLevels[level] | ||
49 | return !ok | ||
50 | } | ||
51 | |||
52 | func (f *LevelFilter) Write(p []byte) (n int, err error) { | ||
53 | // Note in general that io.Writer can receive any byte sequence | ||
54 | // to write, but the "log" package always guarantees that we only | ||
55 | // get a single line. We use that as a slight optimization within | ||
56 | // this method, assuming we're dealing with a single, complete line | ||
57 | // of log data. | ||
58 | |||
59 | if !f.Check(p) { | ||
60 | return len(p), nil | ||
61 | } | ||
62 | |||
63 | return f.Writer.Write(p) | ||
64 | } | ||
65 | |||
66 | // SetMinLevel is used to update the minimum log level | ||
67 | func (f *LevelFilter) SetMinLevel(min LogLevel) { | ||
68 | f.MinLevel = min | ||
69 | f.init() | ||
70 | } | ||
71 | |||
72 | func (f *LevelFilter) init() { | ||
73 | badLevels := make(map[LogLevel]struct{}) | ||
74 | for _, level := range f.Levels { | ||
75 | if level == f.MinLevel { | ||
76 | break | ||
77 | } | ||
78 | badLevels[level] = struct{}{} | ||
79 | } | ||
80 | f.badLevels = badLevels | ||
81 | } | ||