独立サイトのログ管理:アクセスログ、エラーログ、アプリケーションログの収集と分析

独立サイトのログは「ただのファイル群」ではなく、用途がまったく異なる3種類の記録です。アクセスログは誰が来たか、エラーログはどこで落ちたか、アプリケーションログは業務フローがどこまで進んだかを見ます。3種類は保存期間・分析ツール・アラート閾値がそれぞれ異なり...

日志管理:访问、错误、应用三类,各有各的管法Log management: access, error and app logs are handled differently 反直觉:三类日志混在一起存,排障时一份都找不到Counter-intuitive: mixing three log types makes none findable 日志类型Type 看什么What 访问日志Access 谁访问了什么Who requested what 保留 90 天Keep 90 days 错误日志Error 哪里崩了、为什么Where it broke, why 保留 1 年Keep 1 year 应用日志App 业务流程走到哪Where the flow went 保留 30 天Keep 30 days 收集管道:写文件 → 按天切割 → 集中化 → 告警Pipeline: file -> daily rotate -> centralize -> alert 单人团队不必上 ELK,先把切割、集中、告警三件事做对Skip ELK solo; get rotation, centralization, alerting right first 红线:错误率连续 10 分钟超 1% 立即告警;日志不切割会撑爆磁盘Red line: error rate >1% for 10 min = alert; rotate or disk fills 排障顺序:先错误日志定位崩点,再访问日志看影响面,最后应用日志还原流程Triage: error log first, then access log, then app log
独立サイトの3種類のログ:アクセス・エラー・アプリケーションログの保存戦略、収集パイプライン、障害調査の順序

独立サイトのログ管理:アクセスログ、エラーログ、アプリケーションログの収集と分析

結論から言うと:独立サイトのログは「ただのファイル群」ではなく、用途がまったく異なる3種類の記録です。アクセスログは誰が来たか、エラーログはどこで落ちたか、アプリケーションログは業務フローがどこまで進んだかを見ます。3種類は保存期間・分析ツール・アラート閾値がそれぞれ異なるため、混ぜて保存するとどれも見つけられなくなります。最小構成はELKフルセットを導入することではなく、まず3つを正しくやることです。日単位で分割する、一か所に集約する、エラー率が1%を超えたらアラートを出す。アクセスログは90日、エラーログは1年、アプリケーションログは30日保存します。

1. 3種類のログはそれぞれ役割が違う。混ぜて見ない

サーバー上のすべての.logファイルを「ログ」とひとまとめにして、障害のたびに片っ端から開く人が多くいます。しかし3種類のログは、まったく異なる3つの問いに答えるものです。アクセスログ(Nginx/Apacheのaccess.log)は「誰がいつ何をリクエストしたか」に答えます。エラーログ(Nginxのerror.log、PHP-FPMのエラー)は「サーバー側のどこでエラーが出たか」に答えます。アプリケーションログ(自分のコードに書いたlog)は「この注文がどこまで処理され、なぜ失敗したか」に答えます。

ここでの直感に反する判断はこうです。本番障害が起きたとき、最初に開くべきでないのがアクセスログです。アクセスログは量が多くノイズも多いため、先に見ると数千件の200に埋もれてしまいます。正しい順序は、まずエラーログで落ちた箇所を特定し、次にアクセスログで影響範囲(ユーザー数、URL)を確認し、最後にアプリケーションログで業務フローを再現する流れです。これはAIクローラーログ分析「誰が読んでいるかをまず見極める」と同じ考え方です。まず分類し、それから分析します。

ログの種類 回答した質問 典型的な場所 推奨保存期間
アクセスログ 誰が、いつ、何をリクエストしたか Nginx access.log ホットデータ90日
エラーログ サーバー側のどこで、なぜエラーが出たか Nginx error.log / PHPエラー 1年
アプリケーションログ 業務フローがどこまで進み、どこで止まったか コード独自のlog 30日
システムログ サーバー自体のイベント /var/log/messages 30日

2. 収集パイプライン:各ファイルに散在する状態から一か所で検索できる状態へ

個人チームによくあるのは、Nginxのログ、PHPのログ、アプリ独自のログが別々のディレクトリに散らばり、サーバーが再起動したりマシンを移したりすると履歴が途切れる状態です。ログ管理の第一歩は分析ではなく、これらを一か所に集約することです。

ログの流れは4段階です。アプリがファイルに書き、日次でローテーションし、1か所に集約し、エラーにアラートを設定します。ローテーションは logrotate で日次分割と gzip 圧縮を行い、1ファイルが数GBになって開けなくなるのを防ぎます。集約はまず簡単に、rsyslog か軽量エージェントで専用マシンやクラウドのログサービスへ送るだけでも十分です。

1人チームが最初から ELK のような重量級スタックを導入する必要はありません。まずは集約ストレージと検索画面だけで十分で、量が増えてから検討しましょう。CDN サイトではエッジログとオリジンログの両方を取り込む必要があります。詳しくはCDNグローバル高速化。

工程 やり方 ツール / 設定 やらない場合の結果
ファイル出力 統一フォーマットで出力 combined 形式 項目が揃わず解析スクリプトが書きにくい
ローテーション 日次分割と圧縮 logrotate 単一ファイルが肥大化してディスクを圧迫
集約 1か所のストレージに集約 rsyslog / クラウドログ サーバー移行で履歴が途切れる
アラート エラー率のしきい値で通知 監視プラットフォームのルール 障害はユーザーの苦情で初めて気づく

三、エラーログ:1人チームが最も注視すべき種類

3種類の中でエラーログは単位あたりの情報密度が最も高く、優先的に監視する価値があります。アクセスログは1日に数十万行あっても、エラーログは数百行程度。しかしその1行1行が実際の失敗です。エラーログを個別に集約し、個別にアラートを設定するのが最も費用対効果が高い方法です。

しきい値は具体的な数字で設定します。5xx エラー率が10分間連続で1%を超えたら即アラート。単発の異常エラー(データベース接続失敗や決済コールバック失敗など)は1回の発生でアラートし、累積を待ちません。エラーログはレベル分けが必要です。warning は定期的に確認、error と critical は必ずリアルタイム通知。PHP のようなアプリでは致命的エラーとスロークエリを個別に抽出します。

シナリオ例:ある日の午前、アラートが鳴り、5xx エラー率が0.1%から3%に跳ね上がりました。まずエラーログを開くと “PHP-FPM: unable to connect” が大量にあり、バックエンドのプロセスプールが満杯と判明。次にアクセスログでどの URL が引き金かを見ると、新規リリースした API のスロークエリがプロセスプールを圧迫していました。最後にアプリログでどの SQL かを確認。10分以内に特定できる。これがエラーログを優先する価値です。

エラーレベル 例 対応方法 アラートしきい値
critical データベース接続不可、決済失敗 即時通知 1回の発生でアラート
error 5xx、致命的エラー リアルタイム通知 10分以内に > 1%
warning スロークエリ、リトライ 毎日まとめて確認 ベースラインの2倍で集約
notice 正常な業務通知 アーカイブのみでアラートなし アラートなし

四、アプリログ:業務フローを追跡可能にする

アクセスログとエラーログはサーバーの”客観的”な記録ですが、”この問い合わせがなぜ CRM に入らなかったのか”といった業務上の疑問には答えられません。そこで必要になるのがアプリログです。重要な業務ポイントで自分でログを書きます。問い合わせが送信された、データベースに書き込まれた、CRM に送信された、CRM からの応答が失敗した、といった具合です。

アプリケーションログで大事なのは、すべての行に業務を識別するIDを付けることです。たとえば問い合わせIDや注文番号です。こうしておけば、障害が起きたときにそのIDで検索するだけで、その業務が送信されてから完了するまでの流れを一本につなげられます。意味のないログ(「10行目まで実行」など)は書かず、各行が業務上の問いに答えられるようにします。ログ量は1日あたり数十MB以内に抑え、リクエストボディを丸ごと書き込むのは避けます。遅くなるうえに個人情報が漏れるからです。

パフォーマンス低下とログの関係も触れておきます。ログを書きすぎたり、リクエストごとに同期でディスクに書き込んだりすると、それ自体がレスポンスを遅くします。遅いレスポンスの指標の見方はCore Web Vitalsをご覧ください。監視とアラートの全体像はサイト監視とアラート。

業務の節目 記録すべき内容 付けるID 障害時の調べ方
問い合わせ送信 フォーム項目、参照元ページ 問い合わせID IDで送信記録を検索
DB登録 書き込みの成功/失敗 問い合わせID DBに保存されたか確認
CRMへ連携 APIの戻り値、所要時間 問い合わせID CRMが受け取ったか確認
メール通知 送信の成功/失敗 問い合わせID 営業が受け取ったか確認

5. 落とし穴:ログ管理で最も多い3つのミス

1つ目の落とし穴は「ローテーションも保持もしない」です。1つのファイルに書き続けると、3か月後には数GBになり、障害調査でgrepしてもなかなか終わらず、ディスクを埋め尽くしてサイトを落とすこともあります。日次でのローテーションと保持ポリシーは最低ラインです。

2つ目の落とし穴は「リアルタイムだけ残してアーカイブしない」です。ディスクが一杯になると古いものから削除するので、2か月前の障害の起点を調べたくてもデータがありません。ホットデータは90日、期限を過ぎたら圧縮して少なくとも1年はアーカイブする。コストはごくわずかです。3つ目の落とし穴は「ログに機密情報を書く」です。ユーザーのパスワードやクレジットカード番号の全体をログに書くと、ログ基盤にもう1つ漏えい元を作るのと同じです。機密項目は必ずマスクするか、ディスクに残さないようにします。

よくある誤り 表面的な現象 本当の問題 正しい対処
ローテーションなし 単一ファイルが肥大化 ディスク満杯、検索が遅い logrotateで日次ローテーション
履歴を残さない ディスクが一杯なら削除 振り返りたいときにデータがない ホット90日、アーカイブ1年
機密情報を書く ログはデバッグに便利 ログ基盤が漏えい元に 機密項目をマスク
3種類を混ぜて見る 障害時に1つずつ探る 特定が遅く、ノイズが多い エラーを優先し、分類して検索

FAQ よくある質問

自社サイトにELKのようなログ基盤は必ず必要ですか?
いいえ。1人チームがいきなりELKを組むのは過剰投資です。最小構成では、まず3つを正しくやります。日次でログをローテーションする、rsyslogかクラウドのログサービスで1か所に集約する、エラー率にアラートを設定する。この3つは既存ツールで半日あれば設定できます。ログが毎日数GBになり、複数人での検索や長期的な傾向分析が必要になってから、ELKや商用ログサービスを検討すれば十分です。
アクセス、エラー、アプリの3種類のログを一緒に置いてはいけないのはなぜですか?
それぞれが答える問いがまったく違うからです。アクセスログは「誰が来たか」、エラーログは「どこで落ちたか」、アプリケーションログは「業務がどこまで進んだか」を答えます。混ぜてしまうと、障害時に何十万行ものノイズから数行の重要エラーを探すことになり、効率が極端に落ちます。別々に保存し、別々にインデックスを張り、別々に保持期間を設定しましょう。切り分け時はまずエラーログで落ちた箇所を特定し、次にアクセスログで影響範囲を確認し、最後にアプリケーションログで処理の流れを再現します。
各種ログはそれぞれどのくらい保持すべきですか?
アクセスログのホットデータは90日保持し、超えたら圧縮してアーカイブします。エラーログは1年保持します。障害対応やセキュリティインシデントでは数か月前まで遡ることが多いためです。アプリケーションログは30日で十分です。量が多く、直近の業務追跡にしか使いません。日次で分割してgzip圧縮すれば、1年分でも通常は数GBに収まるので、ストレージを節約するために履歴を捨てる必要はありません。
エラーログのアラートしきい値はどう決めますか?
2段階に分けます。5xxエラー率が10分間連続で1%を超えたら即時アラート、健全な値は0.5%未満であるべきです。criticalレベルのエラー(データベースに接続できない、決済コールバックの失敗)は1回でも発生したらアラートし、累積を待ちません。warningレベル(スロークエリ、一時的なリトライ)は即時通知せず、毎日1回まとめて確認します。しきい値は運用開始後に実際のベースラインで調整し、ベースラインより厳しめにして、本当の障害を見逃さないようにします。
アプリケーションログはどのくらい詳しく出すべきですか?性能に影響しませんか?
重要な業務ポイントで出力し、各ログに問い合わせまたは注文IDを付けます。リクエストボディ全体は書き込まないでください。同期でディスクに書くとそれ自体にコストがかかるため、非同期ログやバッファリングを推奨します。1日のログ量は数十MB以内に抑えましょう。原則は、各ログが1つの業務上の問いに答えられることです。意味のないデバッグ行(何行目を実行したか)はリリース前に削除します。
ログにユーザーのパスワードや決済情報を記録してもいいですか?
絶対にいけません。ログは集中保存され、長期間保持され、複数人に検索される可能性があります。パスワードや完全なカード番号を書き込むことは、ログ基盤にもう一つ漏えい元を作るのと同じです。機密フィールドは一律マスクするか保存しないようにします。たとえばカード番号は下4桁だけ残します。同時に、ログ自体のアクセス権限を制限し、誰でもアプリケーションログを閲覧できる状態にしてはいけません。特に業務データを含む場合はなおさらです。

最後に

ログ管理の価値は「どれだけ保存したか」ではなく、「障害発生時に3分以内に特定できるか」にあります。個人運営の独立サイトなら、3種類のログを分け、日次で分割して集中管理し、エラー率が1%を超えたらアラートする。この基本を整えるだけで、日常のトラブル対応時間は「半日ログを探す」から「アラートを一瞥する」に短縮できます。本格的なログ基盤は規模が大きくなってからの話で、立ち上げ時の必須ではありません。

導入は3ステップ。第一に、アクセス・エラー・アプリの3種類のログを分けて保存し、日単位でローテーションしてそれぞれ保持期間を設定する。第二に、rsyslog かクラウドのログサービスで一か所に集約し、業務 ID で検索できるようにする。第三に、エラー率が10分で1%を超えたら、critical エラーは1回でも出たらアラートを上げる。この3ステップを終えれば、オンラインの状態を把握する感覚は「ユーザーからの苦情で初めて知る」から「自分たちが先に気づく」に変わる。運用のペースは次を参考に公式サイト保守期間一緒に並べよう。

覚えておきたい一言。ログは懐かしむために残すハードディスクのファイルではなく、事故現場のドライブレコーダーだ。普段から分類も集約もしていなければ、いざというときに勘で推測するしかない。

环形山
环形山 クレーター専門家

公式アカウント · 環形山 Crater

環形山(Crater)は、WordPress独立サイト開発+Google SEO+GEO全域成長に特化した海外展開支援会社で、スマートハードウェア、産業機器、SaaS、新エネルギーなどの分野を手がけています。

プロダクト能力方法論ホワイトペーパー業界レポート
965件のシェア
78件のナレッジベース