1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ユニークビジョン株式会社Advent Calendar 2024

Day 20

Rustの開発環境で、tracingログを整形して見やすくした

Posted at

はじめに

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のログをそのまま読むよりはかなり読みやすいと思います。

参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?