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  }