構造化ログのスキーマを考えてみる

by

Japan.R 2024の開催が目前になりましたね。私は「Happy Structured Logging in R(構造化ログ入門.R)」というタイトルで応募しました。

ndjsonやjsonlと呼ばれる、1行1JSONレコードで構成される形式のログを使う意義と、その分析例について話す予定です。

ところがどっこい、実は私、自分でログを設計したことはない。なんとなく過去に触った製品を思い出したり、発表用のデモをいじりながら、アプリケーションログのスキーマを考えてみました。 APIサーバーの場合はレスポンスコードなどの情報も追加になると思います。

keytypedescexample
timestringtimestamp2024-12-03 22:38:17
levelstringlog levelINFO
nsstringname of package, project, …japanr2024
messagestringstatic messageReceived request
valueanya value related to the messagelist(input = "tokyo")
session_idstringunique per access01JE6BWEWP0BAAFGPZTZ9GBNM6
trace_idstringunique per request01JE6BWEXF5F6HDD4YFZBP157F
span_idstringunique per task01JE6BWEXSW65DD1EC858XMZQ3
contextnamed list(Optional) additional contextlist(...)

意識したのは2点。

特に、messageはついついx is defined: 1とか、動的な値にしたくなるのですが、静的なほうが分析しやすいかなと思います。

動的なログメッセージでは、フィルタリングする時に正規表現が必要になったり、文字列の値をパースする必要が発生します。

logdata |>
  dplyr::filter(message |> stringr::str_detect("^x is defined:")) |>

一方で静的なログメッセージであれば、messageの完全一致でのフィルタリングが可能な上、valueもJSONで表現可能な範囲で型がつくので数値比較などが容易になると思います。

# { "message": "x is defined", "value": 1 } みたいなログを想定
logdata |>
  # メッセージのフィルタに完全一致を使える
  dplyr::filter(message == "x is defined") |>
  dplyr::filter(value > 0)

もし、もっとこうするといいよーとか参考資料とかあれば、Xとかで教えてもらえると嬉しいです。

https://x.com/Atsushi776

ENJOY