エラーとログの読み方 — どこを見て、何を伝えれば直せるか

この記事は、プログラミングやバイブコーディングをする上で最低限身につけたほうがよい IT の実践的な知識を 1 から身につける「IT 基礎知識講座の一部」です。
エラーメッセージ・スタックトレース・ログの 3 つで、見る場所が分かれます。どこを見て、答える側に何を伝えれば直せるのかを図解で確かめます。

この記事は、エラーメッセージとログの読み方を扱います。

実行が止まったときに出る文字と、動いている間に残る記録は別のものです。

「エラーが出た」という 1 つの出来事から、見る場所は 3 つに分かれます。

「エラーが出た」から、見る場所は 3 つに分かれる
エラーが出たエラーメッセージスタックトレースサーバーのログ何が起きて止まったかどのファイルの何行目かいつ・どの操作で起きたか種類の名前で当たりを付けるその行を開く前後の行を読む
左の 1 つの出来事から、真ん中の 3 つへ広がります。3 列目がそこから分かること、いちばん右が次にすることです。

上の 2 つは実行が止まったときに出る文字、いちばん下は動いている間に残る記録です。

実行が止まると、エラーメッセージとスタックトレースが出る

エラー(error。命令を続けられなくなって実行が止まること)が起きると、実行環境は何が起きたのかを文字で書き出します。

この文字は、役割の違う 2 つに分かれます。

my-app という予約アプリの app.js を node app.js で動かすと、止まったときに次の文字が出ます。

/Users/you/my-app/app.js:5
  return items.price * items.count;
               ^

TypeError: Cannot read properties of undefined (reading 'price')
    at keisan (/Users/you/my-app/app.js:5:16)
    at goukei (/Users/you/my-app/app.js:9:10)
    at Object.<anonymous> (/Users/you/my-app/app.js:13:13)
    at Module._compile (node:internal/modules/cjs/loader:1356:14)

TypeError から始まる 1 行がエラーメッセージ、その下の at で始まる 4 行がスタックトレースです。

エラーメッセージの 1 行も、種類・説明・対象の 3 つに分かれています。

実行が止まったときに画面に出る文字
画面に出る文字の全体
エラーメッセージ — 何が起きたか
TypeError
  • エラーの種類 — 問題の区分を示す名前
  • 名前ごとに、最初に見る場所が変わる
Cannot read properties of undefined
  • 説明 — 何ができなかったか
  • undefined になった値がある
(reading 'price')
  • 対象 — どの値や名前で失敗したか
  • price を読もうとして失敗した
スタックトレース — どこで止まったか
  • at で始まる行の並び
  • 自分が書いた app.js の行
  • ライブラリや実行環境の中の行
外側が画面に出る文字の全体で、中の 2 つがその内訳。エラーメッセージの中は、さらに 3 つに分かれる。

いちばん内側のエラーの種類(error type。実行環境が用意している、問題の区分を示す名前)は、名前ごとに最初に見る場所が変わります。

よく出る 3 つのエラーの種類と、最初に開く場所
TypeError値の種類が合わなかったその値を作った手前の行ReferenceErrorその名前がどこにも無い名前のつづりと定義した行SyntaxError書き方を読み取れない出た行番号の前後の記号
左が種類の名前、真ん中が何ができなかったか、右が最初に開く場所です。名前が分かれば、次にどこを見ればよいかが決まります。

出る文字は、何が起きたかと、どこで起きたか

画面に出る赤い文字は、何が起きたかを短く示すエラーメッセージと、どこで止まったかを並べるスタックトレースの 2 つでできています。

エラーメッセージは種類・説明・対象の 3 つに分けて読み、種類の名前が分かれば、次にどこを開けばよいかの見当がつきます。

スタックトレースは、止まるまでに通った場所の並び

プログラムは処理のまとまりに分かれていて、ある処理が別の処理を呼び出しながら進みます。

並んだ 1 行 1 行は、止まった時点で途中だった処理です。

上にあるほど内側、下にあるほど外側の処理です。

並んだ 1 行動いていた処理そこでしたこと次に見る場所
at keisankeisanitems.price を読もうとした止まったのはこの行
at goukeigoukeikeisan を呼び出した渡した data.cart
at Object.<anonymous>いちばん外側の行goukei を呼び出した渡した値が出どころ

keisan の行が止まった場所ですが、そこにあるのは受け取った値を使う式だけです。

渡した値をたどると、いちばん外側の 13 行目に行き当たります。

そこで渡したものに price が入っていないので、keisan の中で読もうとして止まりました。

並ぶ行には、自分が書いた app.js 以外のファイル名も出ます。

開くのは、自分が書いたファイルの行からです。

並ぶ順番と語は、実行環境によって違います。

Python では at ではなく File と書かれ、並び全体をトレースバック(traceback。スタックトレースの別の呼び方)と呼びます。

同じ内容でも、Node.js と Python で並ぶ向きが逆になる
止まったときに出る文字Node.jsat keisan(app.js:5)止まった行がいちばん上PythonFile "app.py",line 5止まった行がいちばん下
左が止まったときに出る文字です。上が Node.js、下が Python。書き方も並ぶ向きも違いますが、最初に開くのは自分のファイルの行という点は同じです。

並んだ行は、内側から外側への呼び出し

スタックトレースは、止まった場所と、そこへ来るまでに通った場所の並びです。

1 行が 1 つの処理で上にあるほど内側になり、書き方や並ぶ向きは実行環境によって違いますが、自分が書いたファイル名が出ている行から読み始める点は同じです。

ログは、動いている間の出来事を時刻とともに残す記録

ここまでの文字を画面で読めるのは、手元で動かしているときだけです。

公開したサーバーでは、見せると攻撃の手がかりになるので利用者の画面には出しません。

1 回の失敗手元で動かしたとき公開したあと
エラーの種類TypeError: の 1 行ログの ERROR の行
止まった場所at で始まる行ログに残る at の行
起きた時刻打ち込んだ直後行の先頭の時刻
利用者が見る画面同じ画面に全文短い案内だけ

右の列に出てくるのがログ(log。プログラムが動いている間の出来事を、時刻を添えて書き出した記録)です。

エラーが起きたときだけでなく、受け取ったリクエストもうまくいった処理も、起きた順に 1 行ずつ並びます。

予約が保存できないという連絡を受けて、my-app のログを開きます。

その時刻のあたりに、次の 3 行が並んでいました。

2026-09-03 10:12:04  INFO   予約の登録を受け付けた id=182
2026-09-03 10:12:05  ERROR  予約の保存に失敗した id=182
2026-09-03 10:12:05  ERROR  データベースへの接続がタイムアウトした

1 行の中も、時刻・ログレベル・内容という決まった順番で並んでいます。

ログの 1 行の中身
ログの 1 行
2026-09-03 10:12:05
  • いつ起きたか
  • 質問で渡す時刻は、ここから取る
ERROR
  • どれくらい重い出来事か
  • この区分をログレベルという
予約の保存に失敗した id=182
  • 何が起きたか
  • id=182 のような手がかりも書ける
2 行目を 3 つに切り分けたもの。上から順に、いつ・どれくらい重いか・何が起きたか。

真ん中のログレベル(log level。その 1 行がどれくらい重い出来事かを示す区分)があると、重い行だけを取り出して読めます。

ログレベルは、軽い記録から重い記録へ順位が付いている
DEBUGINFOWARNERROR読み込んだ設定port=3000予約の登録を受け付けた保存に 3 秒かかった予約の保存に失敗した手元で途中の値を確かめるとき動いた流れをたどるとき失敗の前ぶれを探すとき止まった原因を探すとき
上から下へ重くなります。左がレベルの名前、真ん中が my-app のログに実際に出る行、右がその行を見る場面です。

区分の名前や数はライブラリによって違いますが、軽い記録から重い記録へ順位が付いていて、どこから上を残すかを設定で決められる点は共通です。

サーバーのログはファイルに書き出すか、ログを集めるサービスに送って残します。

末尾だけを読む操作は 中身を見る — cat / head / tail / wc で扱っています。

見る場所は、止まった側で決まります。

左の囲みで止まったならブラウザのコンソール、右の囲みで止まったならサーバーのログです。

公開したあとに読むのはログ

手元では画面に出る文字が、公開したあとはサーバーのログに残ります。

ログの 1 行は時刻・ログレベル・内容の順に並ぶので、ERROR の行を見つけたら、その前後の行で何が起きていたかを読みます。

質問で伝えるのは、文字の全文・再現手順・環境・時刻の 4 つ

「エラーが出た」とだけ伝えると、答える側は聞き直すところから始めます。

相手はこちらのパソコンを見られないので、同じ状態を相手の手元でも作れるかが分かれ目です。

質問に添える 4 つが、そろうとできること
出た文字の全文(切らずに)起きた時刻(ログを絞る)再現手順(した操作の順)動かした場所(手元か公開後)同じ失敗を見つけられる同じ操作をやり直せる答える側が同じ状態を作れる
左の 4 つが質問に添えるもの。上の 2 つと下の 2 つがそれぞれまとまり、両方そろうと答える側が同じ状態をもう一度作れる。

2 つ目の再現手順(steps to reproduce。同じ状態をもう一度作るための操作の並び)は、答える側が最初に求めるものです。

どの画面で何を入力し、何を押したかを順番に並べ、毎回起きるのかどうかも書き添えます。

4 つは、別々に送らずひとまとまりにして貼ります。

貼る前に、接続先の名前や API キーが混ざっていないかを確かめてください。

質問に貼りつける 1 つのまとまり
質問の本文
出た文字の全文
  • TypeError の行から at の行まで
  • 最後の 1 行だけを切り取らない
再現手順
  • 予約の画面で 12/24 18:00 を選んだ
  • 登録ボタンを押した
動かした場所
  • 手元の my-app か、公開したサーバーか
  • node app.js のように実行に使った 1 行
起きた時刻
  • 2026-09-03 10:12:05
  • ログのどのあたりを見るかが決まる
4 つを 1 か所にまとめて貼る。画面の写真ではなく文字のまま貼ると、受け取った側が語を検索できる。

エラーの文字が出ないまま、思ったとおりに動かないこともあります。

画面が白いまま何も起きない、結果は出るが値が違う、といった場合です。

このときは、ログのどこで記録が途切れているかを探します。

4 つ揃えば、相手が同じ状態を作れる

伝えるのは、出た文字の全文・再現手順・動かした場所・起きた時刻の 4 つです。

どれも答える側が同じ状態をもう一度作るために要るもので、文字は切り取らずそのまま貼り、貼る前に、秘密の値が混ざっていないかだけ確かめてください。

QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1実行が止まったときに出る文字のうち、止まった場所を示すのはどれですか。

Q2公開したサーバーでエラーが起きたとき、詳しい内容はどこで読めますか。

Q3エラーについて質問するとき、答える側が同じ状態を作るために要る情報はどれですか。