github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/log/slog/text_handler.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/context"
     9  	"github.com/shogo82148/std/io"
    10  )
    11  
    12  // TextHandlerは、[io.Writer] にkey=valueペアのシーケンスと改行を続けて書き込むHandlerです。
    13  type TextHandler struct {
    14  	*commonHandler
    15  }
    16  
    17  // NewTextHandlerは、指定されたオプションを使用して、wに書き込む [TextHandler] を作成します。
    18  // optsがnilの場合、デフォルトのオプションが使用されます。
    19  func NewTextHandler(w io.Writer, opts *HandlerOptions) *TextHandler
    20  
    21  // Enabledは、ハンドラが指定されたレベルのレコードを処理するかどうかを報告します。
    22  // ハンドラは、レベルが低いレコードを無視します。
    23  func (h *TextHandler) Enabled(_ context.Context, level Level) bool
    24  
    25  // WithAttrsは、hの属性に続くattrsで構成される新しい [TextHandler] を返します。
    26  func (h *TextHandler) WithAttrs(attrs []Attr) Handler
    27  
    28  func (h *TextHandler) WithGroup(name string) Handler
    29  
    30  // Handleは、引数 [Record] をスペースで区切られたkey=valueの1行としてフォーマットします。
    31  //
    32  // Recordのtimeがゼロの場合、timeは省略されます。
    33  // そうでない場合、keyは"time"であり、RFC3339形式でミリ秒精度で出力されます。
    34  //
    35  // Recordのlevelがゼロの場合、levelは省略されます。
    36  // そうでない場合、keyは"level"であり、 [Level.String] の値が出力されます。
    37  //
    38  // AddSourceオプションが設定されており、ソース情報が利用可能な場合、
    39  // keyは"source"であり、値はFILE:LINEとして出力されます。
    40  //
    41  // メッセージのkeyは"msg"です。
    42  //
    43  // これらまたは他の属性を変更したり、出力から削除するには、
    44  // [HandlerOptions.ReplaceAttr] を使用します。
    45  //
    46  // 値が [encoding.TextMarshaler] を実装している場合、MarshalTextの結果が書き込まれます。
    47  // そうでない場合、[fmt.Sprint] の結果が書き込まれます。
    48  //
    49  // キーと値は、Unicodeスペース文字、非表示文字、'"'、'='を含む場合、 [strconv.Quote] で引用符で囲まれます。
    50  //
    51  // グループ内のキーは、ドットで区切られたコンポーネント(キーまたはグループ名)で構成されます。
    52  // さらにエスケープは行われません。
    53  // したがって、キー"a.b.c"から、2つのグループ"a"と"b"とキー"c"があるか、
    54  // 単一のグループ"a.b"とキー"c"があるか、単一のグループ"a"とキー"b.c"があるかを判断する方法はありません。
    55  // コンポーネント内にドットがある場合でも、キーのグループ構造を再構築する必要がある場合は、
    56  // [HandlerOptions.ReplaceAttr] を使用して、その情報をキーにエンコードします。
    57  //
    58  // Handleの各呼び出しは、io.Writer.Writeへの単一のシリアル化された呼び出しの結果を返します。
    59  func (h *TextHandler) Handle(_ context.Context, r Record) error