Open10

ロガーの調査メモ

かずかず

ログ管理について(from ChatGPT-4o)


Webシステムにおけるロガー(ログ管理)の要件は、システムの安全性、パフォーマンス、トラブルシューティングの効率性などを確保するために非常に重要です。以下に、主要な要件をいくつか挙げます。

1. ログの内容

  • リクエスト情報:IPアドレス、ユーザーエージェント、リファラー、リクエストURL、リクエストメソッド(GET、POSTなど)
  • レスポンス情報:ステータスコード、レスポンス時間
  • エラーログ:例外やエラー発生時の詳細情報
  • セッション情報:ユーザーID、セッションID、ログイン/ログアウトのタイミング
  • 操作ログ:ユーザーの重要な操作(データの更新、削除など)の記録

2. ログの保存場所

  • ローカルストレージ:システム内のディスクに保存
  • リモートストレージ:クラウドサービス(例えばAmazon S3)やリモートサーバーに保存
  • データベース:専用のログ管理データベースに保存

3. ログの保存期間

  • 短期保存:最新のログをすぐに参照できるように短期間(例えば1ヶ月)保存
  • 長期保存:法的要件や監査のために一定期間(例えば1年)以上保存

4. ログのセキュリティ

  • アクセス制御:ログにアクセスできるユーザーを制限
  • 暗号化:ログデータの暗号化を行い、不正アクセスに備える
  • 監査証跡:誰がいつどのログにアクセスしたかの記録

5. ログの解析とモニタリング

  • リアルタイム監視:リアルタイムでログを監視し、異常を検知
  • 定期的なレビュー:定期的にログをレビューして潜在的な問題を発見
  • アラート設定:異常検知時にアラートを発する設定

6. パフォーマンスへの影響

  • 非同期ログ記録:システムのパフォーマンスに影響を与えないよう、非同期でログを記録
  • バッチ処理:ログを一定期間ごとにまとめて処理

7. 法的・コンプライアンス要件

  • 規制遵守:GDPR、HIPAAなどの規制に対応
  • データ保持ポリシー:法的に必要なデータ保持期間の遵守

これらの要件を満たすことで、Webシステムにおけるロガーは信頼性の高い、効果的なログ管理を実現できます。

かずかず

他にも、以下の観点もありそう(from ChatGPT-40)


Webサーバーにおけるロガーを用意する際には、以下の点を意識することが重要です。

1. ログの一貫性と標準化

  • ログフォーマットの統一:ログのフォーマットを統一し、一貫した形式で記録することで、解析や監査が容易になります。
  • タイムゾーンの統一:すべてのログが同じタイムゾーンで記録されるように設定することで、時間に関する混乱を防ぎます。

2. ログの統合

  • 集中管理:複数のサーバーやサービスからのログを一元的に管理し、効率的なログ管理を実現します。
  • 相互参照:異なるログソース間での相互参照を容易にするため、統一されたログ管理システムを導入します。
かずかず

ログのレベルについて(from ChatGPT-40)


ログのレベルも非常に重要な要素です。ログのレベルを適切に設定し管理することで、ログの重要度や緊急度を明確にし、効率的なトラブルシューティングとモニタリングを実現できます。以下に、主要なログレベルとそれぞれの役割を説明します。

1. ログレベルの種類

  • DEBUG:デバッグ情報。開発や詳細なトラブルシューティングのための情報を含む。通常、本番環境では記録しません。
  • INFO:一般的な情報。正常な動作を示すイベントを記録。システムの動作や重要な操作を追跡するのに役立ちます。
  • WARN:警告。システムが正常に動作しているが、将来的に問題が発生する可能性がある状況を示します。
  • ERROR:エラー。機能が失敗したが、システム全体は動作を続けられる状況を示します。これには例外や失敗した操作が含まれます。
  • FATAL:致命的なエラー。システムが即座に停止するような重大な障害を示します。

2. ログレベルの設定

  • 開発環境:開発環境では、DEBUGレベルのログを記録して詳細なデバッグ情報を収集します。
  • テスト環境:テスト環境でも、広範なログを記録して問題の早期発見に努めます。
  • 本番環境:本番環境では、通常INFO以上のレベルのログを記録し、DEBUGログは無効にすることが多いです。

3. ログレベルの管理

  • 適切なフィルタリング:ログレベルを使用して、必要な情報だけを効率的に抽出します。例えば、通常はINFO以上のログを表示し、トラブルシューティング時にはDEBUGログも表示するように設定します。
  • 動的変更:運用中でもログレベルを動的に変更できるようにしておくと、必要に応じて詳細なログを取得することができます。

4. ログレベルの活用

  • アラート設定WARNERRORFATALレベルのログに対してアラートを設定し、迅速に対応できるようにします。
  • レポート作成:定期的にログを解析し、ログレベルごとのイベント数やトレンドを把握してレポートを作成します。
  • パフォーマンス調整:詳細なログ(DEBUGなど)がシステムパフォーマンスに影響を与えないよう、必要な場合にのみ記録するよう調整します。

5. ベストプラクティス

  • 一貫性のある命名:ログメッセージには一貫性のある命名規則を適用し、検索やフィルタリングを容易にします。
  • メッセージの明確化:ログメッセージは具体的で明確な内容にし、問題の特定と解決を迅速に行えるようにします。
  • 定期的なレビュー:ログ設定を定期的にレビューし、システムの成長や変更に対応します。

ログのレベルを適切に管理することで、システムの状態を効果的にモニタリングし、問題の早期発見と解決に繋げることができます。

かずかず

追加でログ回りで意識すべこと(from ChatGPT-40)


ログ管理に関して意識すべき追加のポイントとして、以下の項目が挙げられます:

1. ログのフォーマット

  • 構造化ログ:JSONやXMLなどの構造化フォーマットを使用することで、ログの解析や検索が容易になります。これにより、ログ管理ツールとの互換性も向上します。
  • 一貫したログメッセージ:すべてのログメッセージに対して、一貫したフォーマットと詳細度を維持します。これにより、ログの読み取りと解析が簡単になります。

2. ログの収集と集約

  • 集中管理:複数のサーバーやマイクロサービスからのログを一元的に集約し、管理します。これには、ログ収集ツール(例:Fluentd、Logstash)やログ管理サービス(例:ELK Stack、Splunk)を利用します。
  • 分散ログ管理:分散システムにおいては、各コンポーネントからのログを統合し、システム全体の状況を把握します。

3. ログの保持とアーカイブ

  • ログローテーション:ディスク容量を節約し、古いログを定期的にアーカイブまたは削除するログローテーションの設定を行います。これは、logrotateなどのツールを利用することが一般的です。
  • バックアップ:ログデータの定期的なバックアップを行い、万が一のデータ消失に備えます。

4. ログの可視化とダッシュボード

  • ダッシュボード:KibanaやGrafanaなどのツールを使用して、リアルタイムでログを可視化するダッシュボードを作成します。これにより、迅速にシステムの異常を検知できます。
  • カスタムメトリクス:特定の重要なイベントやエラーメトリクスを追跡し、視覚的にモニタリングします。

5. アラートと通知

  • リアルタイムアラート:エラーログや異常ログをリアルタイムで監視し、異常を検知した際に即座に通知を行います。例えば、PagerDutyやSlackと連携してアラートを送信します。
  • 閾値設定:ログの特定のパターンや頻度に対して閾値を設定し、閾値を超えた場合にアラートを発するようにします。

6. ログの分析と監査

  • トレンド分析:ログデータを定期的に分析し、長期的なトレンドやパターンを把握します。これにより、予防保守やパフォーマンスの最適化が可能となります。
  • 監査ログ:セキュリティやコンプライアンスのために、重要な操作やアクセスを記録する監査ログを保持します。

7. コンプライアンスとプライバシー

  • データマスキング:個人情報や機密情報がログに含まれる場合、データマスキングや匿名化を行い、プライバシーを保護します。
  • 規制遵守:GDPRやHIPAAなどの規制に従い、適切なログ管理ポリシーを実施します。

8. 継続的改善

  • ログレビュー:定期的にログの内容や設定をレビューし、改善点を見つけて実施します。
  • フィードバックループ:ログから得られた情報を元に、システムの改善や運用手順の最適化を行います。

これらのポイントを意識することで、より効果的なログ管理を実現し、システムの信頼性とパフォーマンスを向上させることができます。

かずかず

ログ設計についての記事
https://qiita.com/tadashiro_ninomiya/items/19c774898c68add6185e
https://qiita.com/neo_1-3/items/71276ffea3b23ff31975
https://qiita.com/nanasess/items/350e59b29cceb2f122b3
https://techbookfest.org/product/fcaRxg1xn4tn7CkPzBTDct?productVariantID=sffhhJVaady8reF0qUa1w4 / 第2章

これらと、ChatGpt-4oを踏まえて、ロガー実装の観点の言語化する。

  • ログの出力を構造化することが出来る
  • ログのレベルを柔軟に調整できる & レベルで出力を調整できる
  • サーバー到達時のログの処理の固定時間と、ログを吐き出した時刻の両方あると嬉しい
  • ログの出力先や出力方法を調整できる(OR条件でできる)
    • ex)
      • 出力間隔の調整
      • 標準出力ではなくファイルに書き込むwriterを設定可能
      • 任意の時間間隔でバッファに書き込み、圧縮 & フラッシュするwriterなどを設定可能
        • io.Writerの活用を想定: 薄く作る
  • 分散したログを統合しやすいように、共通の値を容易にログに含められる
  • 出力内容の調整を、出力時に可能
    • 機密情報のマスキングなど
  • ロガーとしてパフォーマンスが高いこと
    • 具体的には余計なメモリ割り当てなどが発生していないなど
  • 可能であれば、サンプリングやローテーションをすでに持っていると嬉しい
  • ロガーのライブラリとして、バッファへのキャッシュ・フラッシュ・削除・ログ書き込みなどのinterfaceを用意していると良さげかも
かずかず

golangにおけるロガーのライブラリ

おおざっぱに見てる感じは、slog・zapだけ調査すればよさそう。
他はgithubのstar数と活動頻度がダメそう。
logrusも去年あたりから、活動頻度が怪しい。

slogでもHandlerで利用する際には、zapのやつを利用できそう
https://github.com/caddyserver/certmagic/issues/254#issuecomment-1783029927
https://github.com/caddyserver/certmagic/issues/254#issuecomment-1783033757

仮に、goのWebサーバー向けのloggerを導入するのであれば、以下の3パターンな気がする

  1. zapのみの利用
  2. zap + slogの利用(zapをバックエンドとして、ほかへの切り替えも簡単にできるようにする)
  3. slogのみの利用(バックエンドは独自実装 or 標準のものを利用する)

この方面で考えるために、zapを色々と触る

かずかず

ログ管理の要件

  • 内容について
    • ログメッセージのフォーマットが決まっていること
      • 構造化されていること
      • 分散したログが統合できるように同じ値が含まれていること(requedt_idなど)
      • ログのレベルを設定できること
      • 時刻を設定できること: タイムゾーンが固定されていること(UnixTimeなら関係ないかも)
      • イベント発生時間とログ出力時間を含んでいること
      • ログのメッセージが設定できること
      • 対象ユーザーやリソースの情報が設定されていること
      • etc
    • GDPRなど法律を順守していること
    • ログの種別
      • アクセスログ: http request・response
      • 操作ログ: ユーザー行動
      • 調査用のログ: SQLクエリなど
      • システムログ: システム内部に関するログ(エラーや何かしらの情報など)
      • 重要ログ: 課金など欠損がなるべく起きてほしくないログ
  • 収集
    • 複数サーバーからログを一元的に集約できる
  • 保存について
    • ログの保存場所を明確にすること
    • ログの保存期間を決めること
    • ログのバックアップがとれていること
    • ログの保存場所を、限られた人しかアクセスできないようにしていること
    • ログが暗号化されていること
  • 活用について
    • ログが可視化されていること
    • 分散されたログが統合して、システム全体の状況が把握できるようになっていること
    • ログが定期的に見直されるようになっていること
    • ログによるアラート通知・閾値設定などで、異常ケースや対応が必要なケースを検知できること
かずかず

zap

https://zenn.dev/oyasumipants/articles/6344ba08ee93b7
https://github.com/uber-go/zap
https://cool-ryo.hatenablog.com/entry/2024/04/01/221642

※ Zerologもある
https://github.com/rs/zerolog

  • Zarologは読んでる感じはそんなに悪い選択肢でもなさそう
    • シンプルかつ、構造化ログ・メモリ割り当てが少ない・フック関数もある
  • パフォーマンス比較は、やっぱりOSSごとに違いそうなので、ちゃんとしたプロジェクトのユースケースで計測したほうがよさげ
  • glogとかlogrはちょっと見ておいたほうが良いかも
かずかず

loggerの選定基準(基本要件を満たしている前提)

  • パフォーマンス
    • プロジェクト相当の内容: 大量のメッセージと値を設定しての動作確認
      • CPU・メモリ利用率の確認
  • メンテナンス性
    • コミット頻度・日時
    • IssueやPRに対する反応
  • コードの書きやすさ
    • 比較したい内容
      • レベルの調整 & レベルによる出力調整
      • ロガーの調整
        • 時刻・フォーマット・書き込み先の調整
        • 共通の値の設定
        • 書き込んだ内容の整形処理
      • レベルごとの出力
      • パラメーターの追加
      • contextの利用
  • 学習コスト
    • ドキュメントの充実度合い
    • 仕様の多さなど
  • 独自の強み