tslog深掘り
特徴
TSベース
多くのloggerlibraryはjs製
https://scrapbox.io/files/6733716c9395a7b88a6c2f28.png
https://scrapbox.io/files/673371a4b924e0a5af811bbc.png
https://scrapbox.io/files/67337348807d79a69fcb2ee5.png
依存なし?(要検証
ランタイムだいたいどこでも動く
ブラウザでも
サイズが軽い
ビルドサイズを見る
https://scrapbox.io/files/673372d456824f588cf42684.png
https://scrapbox.io/files/673372f63ab3ac328620b417.png
https://scrapbox.io/files/6733737a3552acd17c44ec54.png
ベンチマーク
autocannonでとる
typia噛ませた時のリクエスト処理速度見る
Default log level
Pretty & JSON output
Attachable transports:
Native source maps lookup
Sub-logger with inheritance
Secrets masking
ログのライフサイクル
1.message受付→2.mask→3.log object変換→4.metadata追加→5.フォーマット→6.トランスポート
1.log message
BaseLogger.log()で送られる
2.mask
設定がある場合再帰的にマスクされる
maskValuesOfKeysCaseInsensitiveで秘匿情報の有無を指定している
→trueな場合はmaskしたい対象のkey(maskValuesOfKeys)を全てlowerケースへ置換
→その後_recursiveCloneAndMaskValuesOfKeysで処理
→内部でobjectがネストされている場合などは_recursiveCloneAndMaskValuesOfKeysを呼び出す
Object.create(Object.getPrototypeOf(source))
source === "string"な場合、maskValuesRegExで指定されている文字列を元にreplaceをする
プロトタイプチェーン
3.log object変換
マスキングされたLog Messageがオブジェクトへ変換される(cloned)
ちなみに設定でObject自体の生成部分をoverrideもできる
4.metadata追加
metaPropertyデフォは(_meta)に対してログレベルやidなどが突っ込まれる
ここで使用されているthis.runtime.getMetaがnodeやbrowserの差異を吸収している
Object.assignについて
スタックトレース解析してる部分があり、これがパフォーマンス問題を引き起こしかねないので、hideLogPositionForPerformanceが指定できるようになっている
スタックんとレースの深さ分、置換とline.match(/\(([^)]+)\)/) などのマッチングを行っている
ブラウザ版はUAなどがメタデータに含まれている
これnode以外もわかるようになると良さそう
5.フォーマット
ここまでで作成されたmetadata propatyやlogobctを整えることができる(override)
prettyの場合は_prettyFormatLogObjMetaが呼ばれ、人間がわかりやすい形式にフォーマットされる
6.トランスポート
デフォはランタイムごとに整形し標準出力として出力される
ブラウザ
node(?)
全部JSON.stringifyを通して文字列化してる。重そう
JSON.stringify素で使ってるところtypiaとかで早くなりそう
typia
structuredClone
最終的にconsole.logに突っ込む
Default log level
minlevelで制御
Custom log levelなどもいける
Sub-logger
コンテキスト持ってる場合に便利なのか?
Settings
Changing settings at runtime
Type: pretty, json, hidden
Storing logs in a file system with rotating files
Overwriting default behavior