blob: 66892b53a868b9ae77cd7478b845f01850ea3ab2 [file] [log] [blame]
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package severity
import "golang.org/x/exp/event"
// Level represents a severity level of an event.
// The basic severity levels are designed to match the levels used in open telemetry.
// Smaller numerical values correspond to less severe events (such as debug events),
// larger numerical values correspond to more severe events (such as errors and critical events).
//
// The following table defines the meaning severity levels:
// 1-4 TRACE A fine-grained debugging event. Typically disabled in default configurations.
// 5-8 DEBUG A debugging event.
// 9-12 INFO An informational event. Indicates that an event happened.
// 13-16 WARN A warning event. Not an error but is likely more important than an informational event.
// 17-20 ERROR An error event. Something went wrong.
// 21-24 FATAL A fatal error such as application or system crash.
//
// See https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#severity-fields
// for more details
type Level uint64
const (
TraceLevel = Level(1)
DebugLevel = Level(5)
InfoLevel = Level(9)
WarningLevel = Level(13)
ErrorLevel = Level(17)
FatalLevel = Level(21)
MaxLevel = Level(24)
)
const Key = "level"
var (
// Trace is an event.Label for trace level events.
Trace = Of(TraceLevel)
// Debug is an event.Label for debug level events.
Debug = Of(DebugLevel)
// Info is an event.Label for info level events.
Info = Of(InfoLevel)
// Warning is an event.Label for warning level events.
Warning = Of(WarningLevel)
// Error is an event.Label for error level events.
Error = Of(ErrorLevel)
// Fatal is an event.Label for fatal level events.
Fatal = Of(FatalLevel)
)
// Of creates a new Label with this key and the supplied value.
func Of(v Level) event.Label {
return event.Label{Name: Key, Value: event.ValueOf(v)}
}
// From can be used to get a value from a Label.
func From(t event.Label) Level {
return t.Value.Interface().(Level)
}
func (l Level) Class() Level {
switch {
case l > MaxLevel:
return MaxLevel
case l > FatalLevel:
return FatalLevel
case l > ErrorLevel:
return ErrorLevel
case l > WarningLevel:
return WarningLevel
case l > DebugLevel:
return DebugLevel
case l > InfoLevel:
return InfoLevel
case l > TraceLevel:
return TraceLevel
default:
return 0
}
}
func (l Level) String() string {
switch l {
case 0:
return "invalid"
case TraceLevel:
return "trace"
case TraceLevel + 1:
return "trace2"
case TraceLevel + 2:
return "trace3"
case TraceLevel + 3:
return "trace4"
case DebugLevel:
return "debug"
case DebugLevel + 1:
return "debug2"
case DebugLevel + 2:
return "debug3"
case DebugLevel + 3:
return "debug4"
case InfoLevel:
return "info"
case InfoLevel + 1:
return "info2"
case InfoLevel + 2:
return "info3"
case InfoLevel + 3:
return "info4"
case WarningLevel:
return "warning"
case WarningLevel + 1:
return "warning2"
case WarningLevel + 2:
return "warning3"
case WarningLevel + 3:
return "warning4"
case ErrorLevel:
return "error"
case ErrorLevel + 1:
return "error2"
case ErrorLevel + 2:
return "error3"
case ErrorLevel + 3:
return "error4"
case FatalLevel:
return "fatal"
case FatalLevel + 1:
return "fatal2"
case FatalLevel + 2:
return "fatal3"
case FatalLevel + 3:
return "fatal4"
default:
return "invalid"
}
}