一人前エンジニア道場

インフラ・運用 / 約20分

ログ設計: 未来の自分を助ける記録

なぜこれを学ぶか

障害の深夜、あなたの頼みはログだけです。「あの時どうなっていたか」を再現できるログ設計を学びます。

良いログの条件: 構造化(JSON形式)、追跡可能(リクエストID等の相関ID)、適切なレベル(ERROR/WARN/INFO/DEBUG)の3点です。

ログに書くべきでないもの: パスワード、トークン、個人情報。ログは多くの人がアクセスできる場所に保管されます。マスキングは必須です。

「エラーが起きた」だけのログは役に立ちません。何をしようとして(操作)、何が入力で(パラメータ)、何が起きた(エラー)の3点セットで記録します。

メトリクス(数値の集計)はアラートに、ログは詳細調査に、トレースは分散システムの流れの追跡に使います。役割の違いを理解しましょう。

重要ポイント

  • 構造化ログ + 相関ID + 適切なログレベル
  • 機密情報はログに書かない
  • 操作・入力・結果の3点セットで記録

コードレビュー演習

AIに「決済処理にログを追加して」と頼んだ結果です。

app.post('/api/payment', async (c) => {
  const { userId, amount, cardToken } = await c.req.json()
  console.log('payment start', userId, amount, cardToken)

  try {
    const result = await charge(userId, amount, cardToken)
    console.log('ok')
    return c.json(result)
  } catch (e) {
    console.log('error happened')
    return c.json({ error: 'failed' }, 500)
  }
})

このログ実装の問題として、最も重大なものは?

ヒントを見る

2つの観点で見てみましょう: ①ログに「書いてはいけないもの」が書かれていないか(決済情報・秘密情報)②障害調査に「必要な情報」が足りているか(エラーの内容)。

コーディング演習実際に書く

ログのマスキング関数を実装してください。オブジェクトを受け取り、password / token / cardToken / secret というキーの値を '***' に置き換えた「新しいオブジェクト」を返してください。それ以外のキーはそのままコピーし、元のオブジェクトは変更しないでください。

function maskSecrets(logData)

スキルセルフチェック

このレッスンの内容をどの程度理解できましたか?