github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/log/slog/level.go (about) 1 // Copyright 2022 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package slog 6 7 import ( 8 "github.com/shogo82148/std/sync/atomic" 9 ) 10 11 // Levelは、ログイベントの重要度または深刻度を表します。 12 // レベルが高いほど、イベントはより重要または深刻です。 13 type Level int 14 15 // 一般的なレベルの名前。 16 // 17 // レベル番号は本質的に任意ですが、3つの制約を満たすように選択しました。 18 // 任意のシステムは、別の番号付けスキームにマップできます。 19 // 20 // まず、デフォルトのレベルをInfoにしたかったため、Levelsはintであり、 21 // Infoはintのデフォルト値であるゼロです。 22 // 23 // 2番目に、レベルを使用してロガーの冗長性を指定することを簡単にしたかったです。 24 // より深刻なイベントは、より高いレベルを意味するため、 25 // より小さい(または負の)レベルのイベントを受け入れるロガーは、より冗長なロガーを意味します。 26 // ロガーの冗長性は、したがってイベントの深刻度の否定であり、 27 // デフォルトの冗長性0は、INFO以上のすべてのイベントを受け入れます。 28 // 29 // 3番目に、名前付きレベルを持つスキームを収容するために、レベル間に余裕が必要でした。 30 // たとえば、Google Cloud Loggingは、InfoとWarnの間にNoticeレベルを定義しています。 31 // これらの中間レベルはわずかであるため、数字の間のギャップは大きくする必要はありません。 32 // 私たちのギャップ4はOpenTelemetryのマッピングに一致します。 33 // OpenTelemetryのDEBUG、INFO、WARN、ERROR範囲から9を引くと、 34 // 対応するslog Level範囲に変換されます。 35 // OpenTelemetryにはTRACEとFATALという名前がありますが、slogにはありません。 36 // ただし、適切な整数を使用することで、これらのOpenTelemetryレベルをslog Levelsとして表すことができます。 37 const ( 38 LevelDebug Level = -4 39 LevelInfo Level = 0 40 LevelWarn Level = 4 41 LevelError Level = 8 42 ) 43 44 // Stringは、レベルの名前を返します。 45 // レベルに名前がある場合、その名前を大文字で返します。 46 // レベルが名前付き値の間にある場合、 47 // 大文字の名前に整数が追加されます。 48 // 例: 49 // 50 // LevelWarn.String() => "WARN" 51 // (LevelInfo+2).String() => "INFO+2" 52 func (l Level) String() string 53 54 // MarshalJSONは、 [Level.String] の出力を引用符で囲んで、 55 // [encoding/json.Marshaler] を実装します。 56 func (l Level) MarshalJSON() ([]byte, error) 57 58 // UnmarshalJSONは、 [encoding/json.Unmarshaler] を実装します。 59 // [Level.MarshalJSON] によって生成された任意の文字列を受け入れ、 60 // 大文字小文字を区別しません。 61 // また、出力上異なる文字列になる数値オフセットも受け入れます。 62 // たとえば、"Error-8"は "INFO" としてマーシャルされます。 63 func (l *Level) UnmarshalJSON(data []byte) error 64 65 // MarshalTextは、 [Level.String] を呼び出して、 66 // [encoding.TextMarshaler] を実装します。 67 func (l Level) MarshalText() ([]byte, error) 68 69 // UnmarshalTextは、 [encoding.TextUnmarshaler] を実装します。 70 // [Level.MarshalText] によって生成された任意の文字列を受け入れ、 71 // 大文字小文字を区別しません。 72 // また、出力上異なる文字列になる数値オフセットも受け入れます。 73 // たとえば、"Error-8"は "INFO" としてマーシャルされます。 74 func (l *Level) UnmarshalText(data []byte) error 75 76 // Levelはレシーバーを返します。 77 // [Leveler] を実装します。 78 func (l Level) Level() Level 79 80 // LevelVarは、[Level] 変数を表し、[Handler] レベルを動的に変更するために使用されます。 81 // [Leveler] を実装すると同時に、Setメソッドも実装しており、 82 // 複数のゴルーチンから使用することができます。 83 // ゼロ値のLevelVarは [LevelInfo] に対応します。 84 type LevelVar struct { 85 val atomic.Int64 86 } 87 88 // Levelは、vのレベルを返します。 89 func (v *LevelVar) Level() Level 90 91 // Setは、vのレベルをlに設定します。 92 func (v *LevelVar) Set(l Level) 93 94 func (v *LevelVar) String() string 95 96 // MarshalTextは、 [Level.MarshalText] を呼び出して、 97 // [encoding.TextMarshaler] を実装します。 98 func (v *LevelVar) MarshalText() ([]byte, error) 99 100 // UnmarshalTextは、 [Level.UnmarshalText] を呼び出して、 101 // [encoding.TextUnmarshaler] を実装します。 102 func (v *LevelVar) UnmarshalText(data []byte) error 103 104 // Levelerは、[Level] 値を提供します。 105 // 106 // Level自体がLevelerを実装しているため、 107 // [HandlerOptions] など、Levelerが必要な場所では通常、Level値を提供します。 108 // レベルを動的に変更する必要があるクライアントは、 109 // *[LevelVar]などのより複雑なLeveler実装を提供できます。 110 type Leveler interface { 111 Level() Level 112 }