はじめに
Rustでtracingを使って開発している時、JSONログの可読性に困ることはないでしょうか。
アプリケーションのコードを一切変更せずに、開発時のログを見やすくする小技を紹介します。
開発時のログ、JSONのまま読むのはしんどい
tracingはRustでよく使われているロギングライブラリです。構造化ログやスパンのサポート、非同期処理への対応など、本番環境では嬉しい機能が揃っています。
ただ、開発中にこんなログと向き合うのは少々つらいものがあります:
{"timestamp":"2024-12-04T10:00:00Z","level":"INFO","fields":{"message":"Request received","http.method":"GET","http.path":"/api/users","elapsed_milliseconds":120}}
Node.jsのpino-prettyで整形する
pino-prettyはNode.js向けのログ整形ツールです。本来はpinoというNode.jsのロガー用のフォーマッタなのですが、JSON形式のログなら何でも整形できる汎用的なツールとして使えます。
このツールを使うと、tracingのログもかなり見やすくなります。なお、println!やpanic!によるログ出力はJSON形式ではないため、そのまま表示されます。通常のデバッグ作業の妨げになることはありません。
npm install -g pino-pretty
使い方はシンプルで、こんな感じです:
cargo run | pino-pretty --colorize --include msg,level,error_name,http.method,http.path,http.status_code,elapsed_milliseconds
--include
オプションで表示したいフィールドを指定できます。ログに含まれる任意のフィールドを指定可能です。
これで先ほどのログが以下のように変換されます:
INFO: Request received
http.method: GET
http.path: /api/users
elapsed_milliseconds: 120
レベルごとに色分けもされるので(INFOは緑、ERRORは赤)、一目で重要な情報がわかりやすいです。
Docker環境での設定例
ローカル開発環境でcargo watchなどを使いつつログを整形する例です。
Dockerfile
:
FROM rust:1.75 AS base
# 開発環境用のステージ
FROM base AS development
# pino-prettyのインストール
RUN apt-get update && apt-get install -y \
curl \
&& curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
&& apt-get install -y \
nodejs \
&& npm install -g pino-pretty \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# cargo-watchのインストール
RUN cargo install cargo-watch
docker-compose.yml
:
services:
backend:
build:
context: .
dockerfile: Dockerfile
target: "development"
volumes:
- ./src:/app/src
working_dir: /app
command: >
cargo watch -x fmt -s 'cargo run |
pino-pretty --colorize \
--include msg,level,error_name,http.method,http.path,http.status_code,elapsed_milliseconds'
カスタマイズ例
用途に応じて出力形式を調整できます:
# タイムスタンプを含める
cargo run | pino-pretty --colorize --include timestamp,msg,level
# 出力形式のカスタマイズ
cargo run | pino-pretty --colorize --messageFormat "{level}: {msg} ({http.method} {http.path})"
まとめ
小技ですが、tracingのログをそのまま読むよりはかなり読みやすいと思います。