サーバーのログ調査・障害対応にAI(LLM)を使う実践テクニック

サーバーの障害調査は、突き詰めると「ログを読む」作業だ。だが見慣れないエラーメッセージや、数千行のログから異常を探す作業は骨が折れる。ここ最近は、その最初の「当たりをつける」部分をLLM(ChatGPTやClaude、あるいはローカルのOllama)に任せると、原因究明が明らかに速くなった。この記事では、実際のサーバー運用でどうAIを組み込むか、そして丸投げしないための注意点をまとめる。

AIが効く場面・効かない場面

まず期待値を正しく持っておきたい。LLMが得意なのは次のような場面。

  • 見慣れないエラーメッセージの意味と、典型的な原因の列挙
  • 長いログから「それっぽい異常行」を拾い上げる一次スクリーニング
  • 設定ファイル(nginx.confやsystemdのunit)のレビュー、書き間違いの指摘
  • 複雑なワンライナーやオプションの意味の解説

逆に、そのサーバー固有の事情(過去の変更履歴、独自構成)は当然知らないし、断定的に間違った対処を提案してくることもある。「原因の候補を出させる相棒」であって「最終判断者」ではない、という距離感が大事。

いちばん手軽な使い方:ログを貼るだけ

難しく考えなくてよい。まずは該当ログを抜き出して、チャットにそのまま貼るだけでも十分効く。

journalctl -u nginx -p err --since "1 hour ago" --no-pager

この出力をコピーして、「以下のnginxのエラーログの原因を推定して、確認すべき点を挙げて」と一言添えて貼る。プロンプトにDebian 13 / nginx 1.26 / PHP-FPM構成のように環境を書いておくと、回答の精度が上がる。

コマンドラインから直接AIに投げる

毎回コピペするのが面倒なら、ログをそのままAPIに流し込むと速い。ここではAnthropicのClaude APIに投げる例。ログを安全にJSONへ埋め込むためjqでリクエストを組み立てるのがコツ(ログ内の引用符や改行でJSONが壊れるのを防げる)。

LOG=$(journalctl -u php8.3-fpm -p err -n 50 --no-pager)

jq -n --arg log "$LOG" '{
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [
    { role: "user", content: ("次のログのエラー原因と対処を日本語で簡潔に:\n\n" + $log) }
  ]
}' | curl -s https://api.anthropic.com/v1/messages \
     -H "x-api-key: $ANTHROPIC_API_KEY" \
     -H "anthropic-version: 2023-06-01" \
     -H "content-type: application/json" \
     -d @- | jq -r '.content[0].text'

APIキーは環境変数ANTHROPIC_API_KEYから渡し、コードやシェル履歴に残さない。jqcurlさえ入っていれば動くので、そのままエイリアスにしておくと調査が捗る。

機密ログはローカルLLM(Ollama)に投げる

ここが実運用でいちばん重要な判断ポイント。ログには内部IP・ホスト名・場合によっては個人情報やトークンが混ざる。そういったログを外部APIに送るのは情報漏洩リスクそのものだ。マスクするのが面倒な機密ログは、外に出さずローカルのOllamaに投げる。

LOG=$(journalctl -u nginx -p err -n 50 --no-pager)
ollama run llama3.2 "以下のnginxエラーログの原因と対処法を説明して:

$LOG"

ローカル実行なのでログが手元から出ない。精度は外部の大型モデルに劣るが、一次切り分けなら3B程度のモデルでも十分役に立つ。GPUなしVPSでの現実的なスペックについては別記事にまとめている。

実例:502 Bad Gatewayの切り分け

nginxが502を返している時、エラーログにはこんな行が出る。

connect() failed (111: Connection refused) while connecting to upstream

これをLLMに投げると、「upstream(この場合PHP-FPM)がダウンしているか、ソケットのパスが食い違っている可能性」を即座に指摘してくる。あとは自分でsystemctl status php8.3-fpmss -x | grep phpで裏を取ればよい。ゼロから調べるより、当たりがついている分だけ速い。

丸投げしないための鉄則

  • 機密情報を外部AIに送らない。IP・鍵・個人情報を含むログはマスクするかローカルLLMで処理する。
  • 提案されたコマンドは必ず理解してから実行する。特にrmや設定上書き、権限変更を伴うものは、意味を確認せず打たない。AIは平気で破壊的な操作を提案してくることがある。
  • 回答は仮説として扱い、必ず自分で裏を取る。それらしく間違える(ハルシネーション)ので、最終的な根拠は自分の目で確認したログとコマンド結果に置く。

まとめ

サーバー運用にAIを組み込むと言っても、やることは「ログを投げて当たりをつけてもらう」というシンプルな話だ。手軽さと機密性のバランスで、外部API(Claude/ChatGPT)とローカルLLM(Ollama)を使い分ければ実用に足る。あくまで一次調査の相棒として使い、最終判断と実行は自分の手で行う——この線を守れば、障害対応のスピードは確実に上がる。

読んで頂いて有り難うございます!