ロガーの調査メモ
自分でのSlog周りの雑まとめ
- https://zenn.dev/link/comments/f2ae6039c8688b
- https://zenn.dev/link/comments/899a8547578330
- https://zenn.dev/link/comments/17e09e19e9732d
- https://zenn.dev/link/comments/8cdaa130638d74
- https://zenn.dev/link/comments/97faf67ef3fde3
- https://zenn.dev/link/comments/de950de0ffec16
- https://zenn.dev/link/comments/df08792ade5f96
- https://zenn.dev/link/comments/30706049ebb6b6
ログ管理について(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. ログレベルの活用
-
アラート設定:
WARN
、ERROR
、FATAL
レベルのログに対してアラートを設定し、迅速に対応できるようにします。 - レポート作成:定期的にログを解析し、ログレベルごとのイベント数やトレンドを把握してレポートを作成します。
-
パフォーマンス調整:詳細なログ(
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://techbookfest.org/product/fcaRxg1xn4tn7CkPzBTDct?productVariantID=sffhhJVaady8reF0qUa1w4 / 第2章
これらと、ChatGpt-4oを踏まえて、ロガー実装の観点の言語化する。
- ログの出力を構造化することが出来る
- ログのレベルを柔軟に調整できる & レベルで出力を調整できる
- サーバー到達時のログの処理の固定時間と、ログを吐き出した時刻の両方あると嬉しい
- ログの出力先や出力方法を調整できる(OR条件でできる)
- ex)
- 出力間隔の調整
- 標準出力ではなくファイルに書き込むwriterを設定可能
- 任意の時間間隔でバッファに書き込み、圧縮 & フラッシュするwriterなどを設定可能
- io.Writerの活用を想定: 薄く作る
- ex)
- 分散したログを統合しやすいように、共通の値を容易にログに含められる
- 出力内容の調整を、出力時に可能
- 機密情報のマスキングなど
- ロガーとしてパフォーマンスが高いこと
- 具体的には余計なメモリ割り当てなどが発生していないなど
- 可能であれば、サンプリングやローテーションをすでに持っていると嬉しい
- ロガーのライブラリとして、バッファへのキャッシュ・フラッシュ・削除・ログ書き込みなどのinterfaceを用意していると良さげかも
golangにおけるロガーのライブラリ
- https://qiita.com/nakaryooo/items/2ee140cf4aafa9ff1732#go-spew
- https://github.com/go-kit/log
- https://github.com/inconshreveable/log15
- https://github.com/uber-go/zap
- https://github.com/apex/log
- https://github.com/sirupsen/logrus
- https://github.com/rs/zerolog
- https://zenn.dev/moriyoshi/articles/1af0659e29d727
おおざっぱに見てる感じは、slog・zapだけ調査すればよさそう。
他はgithubのstar数と活動頻度がダメそう。
logrusも去年あたりから、活動頻度が怪しい。
slogでもHandlerで利用する際には、zapのやつを利用できそう
仮に、goのWebサーバー向けのloggerを導入するのであれば、以下の3パターンな気がする
- zapのみの利用
- zap + slogの利用(zapをバックエンドとして、ほかへの切り替えも簡単にできるようにする)
- slogのみの利用(バックエンドは独自実装 or 標準のものを利用する)
この方面で考えるために、zapを色々と触る
ログ管理の要件
- 内容について
- ログメッセージのフォーマットが決まっていること
- 構造化されていること
- 分散したログが統合できるように同じ値が含まれていること(requedt_idなど)
- ログのレベルを設定できること
- 時刻を設定できること: タイムゾーンが固定されていること(UnixTimeなら関係ないかも)
- イベント発生時間とログ出力時間を含んでいること
- ログのメッセージが設定できること
- 対象ユーザーやリソースの情報が設定されていること
- etc
- GDPRなど法律を順守していること
- ログの種別
- アクセスログ: http request・response
- 操作ログ: ユーザー行動
- 調査用のログ: SQLクエリなど
- システムログ: システム内部に関するログ(エラーや何かしらの情報など)
- 重要ログ: 課金など欠損がなるべく起きてほしくないログ
- ログメッセージのフォーマットが決まっていること
- 収集
- 複数サーバーからログを一元的に集約できる
- 保存について
- ログの保存場所を明確にすること
- ログの保存期間を決めること
- ログのバックアップがとれていること
- ログの保存場所を、限られた人しかアクセスできないようにしていること
- ログが暗号化されていること
- 活用について
- ログが可視化されていること
- 分散されたログが統合して、システム全体の状況が把握できるようになっていること
- ログが定期的に見直されるようになっていること
- ログによるアラート通知・閾値設定などで、異常ケースや対応が必要なケースを検知できること
zap
※ Zerologもある
- Zarologは読んでる感じはそんなに悪い選択肢でもなさそう
- シンプルかつ、構造化ログ・メモリ割り当てが少ない・フック関数もある
- パフォーマンス比較は、やっぱりOSSごとに違いそうなので、ちゃんとしたプロジェクトのユースケースで計測したほうがよさげ
- glogとかlogrはちょっと見ておいたほうが良いかも
loggerの選定基準(基本要件を満たしている前提)
- パフォーマンス
- プロジェクト相当の内容: 大量のメッセージと値を設定しての動作確認
- CPU・メモリ利用率の確認
- プロジェクト相当の内容: 大量のメッセージと値を設定しての動作確認
- メンテナンス性
- コミット頻度・日時
- IssueやPRに対する反応
- コードの書きやすさ
- 比較したい内容
- レベルの調整 & レベルによる出力調整
- ロガーの調整
- 時刻・フォーマット・書き込み先の調整
- 共通の値の設定
- 書き込んだ内容の整形処理
- レベルごとの出力
- パラメーターの追加
- contextの利用
- 比較したい内容
- 学習コスト
- ドキュメントの充実度合い
- 仕様の多さなど
- 独自の強み