Q1実行が止まったときに出る文字のうち、止まった場所を示すのはどれですか。
エラーとログの読み方 — どこを見て、何を伝えれば直せるか
この記事は、プログラミングやバイブコーディングをする上で最低限身につけたほうがよい IT の実践的な知識を 1 から身につける「IT 基礎知識講座の一部」です。
エラーメッセージ・スタックトレース・ログの 3 つで、見る場所が分かれます。どこを見て、答える側に何を伝えれば直せるのかを図解で確かめます。
この記事は、エラーメッセージとログの読み方を扱います。
実行が止まったときに出る文字と、動いている間に残る記録は別のものです。
「エラーが出た」という 1 つの出来事から、見る場所は 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 つに分かれています。
- エラーの種類 — 問題の区分を示す名前
- 名前ごとに、最初に見る場所が変わる
- 説明 — 何ができなかったか
- undefined になった値がある
- 対象 — どの値や名前で失敗したか
- price を読もうとして失敗した
- at で始まる行の並び
- 自分が書いた app.js の行
- ライブラリや実行環境の中の行
いちばん内側のエラーの種類(error type。実行環境が用意している、問題の区分を示す名前)は、名前ごとに最初に見る場所が変わります。
出る文字は、何が起きたかと、どこで起きたか
画面に出る赤い文字は、何が起きたかを短く示すエラーメッセージと、どこで止まったかを並べるスタックトレースの 2 つでできています。
エラーメッセージは種類・説明・対象の 3 つに分けて読み、種類の名前が分かれば、次にどこを開けばよいかの見当がつきます。
スタックトレースは、止まるまでに通った場所の並び
プログラムは処理のまとまりに分かれていて、ある処理が別の処理を呼び出しながら進みます。
並んだ 1 行 1 行は、止まった時点で途中だった処理です。
上にあるほど内側、下にあるほど外側の処理です。
| 並んだ 1 行 | 動いていた処理 | そこでしたこと | 次に見る場所 |
|---|---|---|---|
| at keisan | keisan | items.price を読もうとした | 止まったのはこの行 |
| at goukei | goukei | keisan を呼び出した | 渡した data.cart |
| at Object.<anonymous> | いちばん外側の行 | goukei を呼び出した | 渡した値が出どころ |
keisan の行が止まった場所ですが、そこにあるのは受け取った値を使う式だけです。
渡した値をたどると、いちばん外側の 13 行目に行き当たります。
そこで渡したものに price が入っていないので、keisan の中で読もうとして止まりました。
並ぶ行には、自分が書いた app.js 以外のファイル名も出ます。
開くのは、自分が書いたファイルの行からです。
並ぶ順番と語は、実行環境によって違います。
Python では at ではなく File と書かれ、並び全体をトレースバック(traceback。スタックトレースの別の呼び方)と呼びます。
並んだ行は、内側から外側への呼び出し
スタックトレースは、止まった場所と、そこへ来るまでに通った場所の並びです。
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 行の中も、時刻・ログレベル・内容という決まった順番で並んでいます。
- いつ起きたか
- 質問で渡す時刻は、ここから取る
- どれくらい重い出来事か
- この区分をログレベルという
- 何が起きたか
- id=182 のような手がかりも書ける
真ん中のログレベル(log level。その 1 行がどれくらい重い出来事かを示す区分)があると、重い行だけを取り出して読めます。
区分の名前や数はライブラリによって違いますが、軽い記録から重い記録へ順位が付いていて、どこから上を残すかを設定で決められる点は共通です。
サーバーのログはファイルに書き出すか、ログを集めるサービスに送って残します。
末尾だけを読む操作は 中身を見る — cat / head / tail / wc で扱っています。
見る場所は、止まった側で決まります。
左の囲みで止まったならブラウザのコンソール、右の囲みで止まったならサーバーのログです。
公開したあとに読むのはログ
手元では画面に出る文字が、公開したあとはサーバーのログに残ります。
ログの 1 行は時刻・ログレベル・内容の順に並ぶので、ERROR の行を見つけたら、その前後の行で何が起きていたかを読みます。
質問で伝えるのは、文字の全文・再現手順・環境・時刻の 4 つ
「エラーが出た」とだけ伝えると、答える側は聞き直すところから始めます。
相手はこちらのパソコンを見られないので、同じ状態を相手の手元でも作れるかが分かれ目です。
2 つ目の再現手順(steps to reproduce。同じ状態をもう一度作るための操作の並び)は、答える側が最初に求めるものです。
どの画面で何を入力し、何を押したかを順番に並べ、毎回起きるのかどうかも書き添えます。
4 つは、別々に送らずひとまとまりにして貼ります。
貼る前に、接続先の名前や API キーが混ざっていないかを確かめてください。
- TypeError の行から at の行まで
- 最後の 1 行だけを切り取らない
- 予約の画面で 12/24 18:00 を選んだ
- 登録ボタンを押した
- 手元の my-app か、公開したサーバーか
- node app.js のように実行に使った 1 行
- 2026-09-03 10:12:05
- ログのどのあたりを見るかが決まる
エラーの文字が出ないまま、思ったとおりに動かないこともあります。
画面が白いまま何も起きない、結果は出るが値が違う、といった場合です。
このときは、ログのどこで記録が途切れているかを探します。
4 つ揃えば、相手が同じ状態を作れる
伝えるのは、出た文字の全文・再現手順・動かした場所・起きた時刻の 4 つです。
どれも答える側が同じ状態をもう一度作るために要るもので、文字は切り取らずそのまま貼り、貼る前に、秘密の値が混ざっていないかだけ確かめてください。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2公開したサーバーでエラーが起きたとき、詳しい内容はどこで読めますか。
Q3エラーについて質問するとき、答える側が同じ状態を作るために要る情報はどれですか。