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