github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/log/slog/json_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  // JSONHandlerは、レコードを行区切りのJSONオブジェクトとして [io.Writer] に書き込む [Handler] です。
    13  type JSONHandler struct {
    14  	*commonHandler
    15  }
    16  
    17  // NewJSONHandlerは、指定されたオプションを使用して、
    18  // wに書き込む [JSONHandler] を作成します。
    19  // optsがnilの場合、デフォルトのオプションが使用されます。
    20  func NewJSONHandler(w io.Writer, opts *HandlerOptions) *JSONHandler
    21  
    22  // Enabledは、ハンドラが指定されたレベルのレコードを処理するかどうかを報告します。
    23  // ハンドラは、レベルが低いレコードを無視します。
    24  func (h *JSONHandler) Enabled(_ context.Context, level Level) bool
    25  
    26  // WithAttrsは、hの属性に続く属性で構成される新しい [JSONHandler] を返します。
    27  func (h *JSONHandler) WithAttrs(attrs []Attr) Handler
    28  
    29  func (h *JSONHandler) WithGroup(name string) Handler
    30  
    31  // Handleは、引数の [Record] をJSONオブジェクトとして1行にフォーマットします。
    32  //
    33  // Recordの時間がゼロの場合、時間は省略されます。
    34  // そうでない場合、キーは "time" であり、値はjson.Marshalと同様に出力されます。
    35  //
    36  // Recordのレベルがゼロの場合、レベルは省略されます。
    37  // そうでない場合、キーは "level" であり、 [Level.String] の値が出力されます。
    38  //
    39  // AddSourceオプションが設定されており、ソース情報が利用可能な場合、
    40  // キーは "source" であり、値は [Source] 型のレコードです。
    41  //
    42  // メッセージのキーは "msg" です。
    43  //
    44  // これらまたは他の属性を変更したり、出力から削除したりするには、
    45  // [HandlerOptions.ReplaceAttr] を使用します。
    46  //
    47  // 値は、SetEscapeHTML(false)を使用して [encoding/json.Encoder] と同様にフォーマットされます。
    48  // ただし、2つの例外があります。
    49  //
    50  // 最初に、値がエラー型であるAttrは、そのErrorメソッドを呼び出すことによって文字列としてフォーマットされます。
    51  // この特別な処理は、[encoding/json] パッケージによって処理される構造体、スライス、マップ、その他のデータ構造に埋め込まれたエラーではなく、
    52  // Attrs内のエラーのみが受け取ります。
    53  //
    54  // 2つ目は、エンコードの失敗がHandleからエラーを返すことはありません。
    55  // 代わりに、エラーメッセージが文字列としてフォーマットされます。
    56  //
    57  // Handleの各呼び出しは、io.Writer.Writeに対して1回のシリアル化された呼び出しを生成します。
    58  func (h *JSONHandler) Handle(_ context.Context, r Record) error