Cách đọc lỗi và log — xem ở đâu và cần báo gì để sửa được

Bài viết này nằm trong khóa Kiến thức nền tảng về CNTT, xây dựng từ đầu những kiến thức CNTT thực tế tối thiểu mà bạn cần để lập trình và vibe coding.
Nơi cần xem chia thành ba: thông báo lỗi, stack trace và log. Các sơ đồ cho thấy nên xem ở đâu và cần nói gì với người trả lời để vấn đề được sửa.

Bài viết này nói về cách đọc thông báo lỗi và log.

Dòng chữ hiện ra khi chương trình dừng và bản ghi được lưu lại trong lúc chương trình đang chạy là hai thứ khác nhau.

Từ một sự việc duy nhất là "đã xảy ra lỗi", nơi cần xem chia thành ba chỗ.

Từ "đã xảy ra lỗi", nơi cần xem chia thành ba
Đã xảy ralỗiThông báolỗiStacktraceLog củaserverChuyện gì xảy rakhiến nó dừngFile nào vàdòng thứ mấyXảy ra lúc nào,khi thao tác gìKhoanh vùng theotên loại lỗiMở dòng đóĐọc dòng lân cận
Một sự việc duy nhất bên trái lan ra thành ba mục ở giữa. Cột thứ ba là điều mỗi mục cho bạn biết, ngoài cùng bên phải là việc bạn làm tiếp theo.

Hai mục trên là dòng chữ hiện ra khi chương trình dừng, mục dưới cùng là bản ghi được lưu lại trong lúc chương trình đang chạy.

Khi chương trình dừng, thông báo lỗi và stack trace hiện ra

Khi xảy ra lỗi (error — việc thực thi dừng lại vì không thể chạy tiếp các lệnh), môi trường chạy sẽ viết ra bằng chữ những gì đã xảy ra.

Dòng chữ này chia thành hai phần có vai trò khác nhau.

Khi bạn chạy app.js của ứng dụng đặt chỗ my-app bằng node app.js, dòng chữ sau hiện ra tại chỗ nó dừng.

/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)

Dòng đầu bắt đầu bằng TypeError là thông báo lỗi, còn bốn dòng bên dưới bắt đầu bằng at là stack trace.

Bản thân một dòng thông báo lỗi cũng chia thành ba phần: loại lỗi, mô tả và đối tượng.

Dòng chữ hiện trên màn hình khi chương trình dừng
Toàn bộ dòng chữ hiện trên màn hình
Thông báo lỗi — chuyện gì đã xảy ra
TypeError
  • Loại lỗi — tên gọi cho nhóm vấn đề
  • Tùy theo tên mà nơi xem đầu tiên khác nhau
Cannot read properties of undefined
  • Mô tả — việc gì đã không làm được
  • Có một giá trị đã trở thành undefined
(reading 'price')
  • Đối tượng — giá trị hay tên nào đã thất bại
  • Nó đã thử đọc price và thất bại
Stack trace — dừng lại ở đâu
  • Dãy các dòng bắt đầu bằng at
  • Các dòng trong app.js do bạn viết
  • Các dòng bên trong thư viện và môi trường chạy
Khung ngoài là toàn bộ dòng chữ hiện trên màn hình, hai khung bên trong là các phần của nó. Riêng thông báo lỗi lại chia thành ba phần nữa.

Phần trong cùng là loại lỗi (error type — tên do môi trường chạy đặt sẵn để chỉ nhóm vấn đề), và tùy theo tên mà nơi bạn xem đầu tiên thay đổi.

Ba loại lỗi thường gặp và nơi mở đầu tiên
TypeErrorKiểu giá trịkhông khớpDòng phía trướctạo ra giá trịReferenceErrorKhông có tên đóở bất cứ đâuChính tả của tênvà dòng khai báoSyntaxErrorKhông đọc đượccách viếtKý hiệu quanhdòng được báo
Bên trái là tên loại lỗi, ở giữa là việc gì đã không làm được, bên phải là nơi mở đầu tiên. Biết được tên là biết nên xem tiếp ở đâu.

Dòng chữ cho biết chuyện gì đã xảy ra và xảy ra ở đâu

Dòng chữ màu đỏ trên màn hình gồm hai thứ: thông báo lỗi nêu ngắn gọn chuyện gì đã xảy ra, và stack trace liệt kê nơi chương trình dừng.

Hãy đọc thông báo lỗi theo ba phần là loại lỗi, mô tả và đối tượng; khi biết tên loại lỗi, bạn đoán được nên mở chỗ nào tiếp theo.

Stack trace là dãy những nơi chương trình đã đi qua trước khi dừng

Chương trình được chia thành các khối xử lý, và khối này gọi khối kia trong lúc chạy.

Mỗi dòng được liệt kê là một khối xử lý còn đang dở khi chương trình dừng.

Dòng càng ở trên thì càng ở phía trong, dòng càng ở dưới thì càng ở phía ngoài.

Dòng được liệt kêXử lý đang chạyViệc đã làm ở đóNơi xem tiếp theo
at keisankeisanĐã thử đọc items.priceĐây là dòng chương trình dừng
at goukeigoukeiĐã gọi keisandata.cart đã truyền vào
at Object.<anonymous>Dòng ngoài cùngĐã gọi goukeiGiá trị truyền ở đây là nguồn gốc

Dòng keisan là nơi chương trình dừng, nhưng ở đó chỉ có một biểu thức dùng giá trị nhận được.

Lần theo giá trị đã truyền, bạn đi tới dòng 13 ở ngoài cùng.

Thứ được truyền ở đó không chứa price, nên chương trình dừng khi keisan thử đọc nó.

Các dòng được liệt kê còn hiện cả tên file khác ngoài app.js do bạn viết.

Hãy bắt đầu bằng cách mở dòng của file do chính bạn viết.

Thứ tự và cách viết khác nhau tùy môi trường chạy.

Python viết File thay cho at, và gọi cả dãy đó là traceback (một tên gọi khác của stack trace).

Cùng một nội dung nhưng Node.js và Python liệt kê theo hai chiều ngược nhau
Dòng chữ hiện rakhi dừngNode.jsat keisan(app.js:5)Dòng dừng lạinằm trên cùngPythonFile "app.py",line 5Dòng dừng lạinằm dưới cùng
Bên trái là dòng chữ hiện ra khi chương trình dừng. Node.js ở trên, Python ở dưới. Cách viết và chiều liệt kê khác nhau, nhưng ở cả hai bạn đều mở dòng của file do mình viết trước.

Các dòng liệt kê là chuỗi gọi từ trong ra ngoài

Stack trace là dãy gồm nơi chương trình dừng và những nơi nó đã đi qua để đến đó.

Mỗi dòng là một khối xử lý, dòng càng ở trên thì càng ở phía trong; cách viết và chiều liệt kê khác nhau tùy môi trường chạy, nhưng ở đâu bạn cũng bắt đầu đọc từ dòng có tên file do chính bạn viết.

Log là bản ghi các sự việc trong lúc chương trình chạy, kèm thời điểm

Những dòng chữ nói đến từ đầu bài đến đây chỉ đọc được trên màn hình khi bạn chạy chương trình trên máy của mình.

Trên server công khai, chúng không hiện lên màn hình của người dùng, vì để lộ ra là cho kẻ tấn công một manh mối.

Một lần thất bạiKhi chạy trên máy của bạnSau khi đã công khai
Loại lỗiDòng TypeError:Dòng ERROR trong log
Nơi chương trình dừngCác dòng bắt đầu bằng atCác dòng at còn lại trong log
Thời điểm xảy raNgay sau khi bạn gõ lệnhThời điểm ở đầu dòng
Thứ người dùng nhìn thấyToàn văn trên cùng màn hìnhChỉ một thông báo ngắn

Thứ xuất hiện ở cột bên phải là log (bản ghi các sự việc trong lúc chương trình chạy, được viết ra kèm thời điểm).

Không chỉ có lỗi: request nhận được và cả những xử lý thành công cũng được liệt kê, mỗi dòng một mục, theo đúng thứ tự xảy ra.

Sau khi nhận được báo là không lưu được đơn đặt chỗ, bạn mở log của my-app.

Quanh thời điểm đó có ba dòng sau.

2026-09-03 10:12:04  INFO   đã tiếp nhận đăng ký đặt chỗ id=182
2026-09-03 10:12:05  ERROR  lưu đơn đặt chỗ thất bại id=182
2026-09-03 10:12:05  ERROR  kết nối tới cơ sở dữ liệu đã hết thời gian chờ

Bên trong một dòng cũng vậy, các phần xếp theo thứ tự cố định: thời điểm, mức log và nội dung.

Bên trong một dòng log có gì
Một dòng log
2026-09-03 10:12:05
  • Xảy ra khi nào
  • Thời điểm bạn đưa vào câu hỏi lấy từ đây
ERROR
  • Sự việc nặng đến mức nào
  • Cách phân loại này gọi là mức log
lưu đơn đặt chỗ thất bại id=182
  • Chuyện gì đã xảy ra
  • Có thể ghi thêm manh mối như id=182
Dòng thứ hai được cắt thành ba phần. Từ trên xuống: khi nào, nặng đến mức nào và chuyện gì đã xảy ra.

Nhờ mức log (log level — cách phân loại cho biết sự việc ở dòng đó nặng đến mức nào) nằm ở giữa, bạn có thể lọc ra và chỉ đọc những dòng nặng.

Mức log được xếp hạng từ bản ghi nhẹ đến bản ghi nặng
DEBUGINFOWARNERRORCấu hình đã đọcport=3000Đã tiếp nhậnđăng ký đặt chỗViệc lưu mất3 giâyLưu đơn đặt chỗthất bạiKhi xem giá trịtrên máy của bạnKhi lần theoluồng đã chạyKhi tìm dấu hiệutrước thất bạiKhi tìm lý dochương trình dừng
Mức độ nặng tăng dần từ trên xuống. Bên trái là tên mức, ở giữa là dòng thực sự xuất hiện trong log của my-app, bên phải là lúc bạn đọc dòng đó.

Tên và số lượng phân loại khác nhau tùy thư viện, nhưng điểm chung là chúng được xếp hạng từ bản ghi nhẹ đến bản ghi nặng, và bạn có thể chọn trong thiết lập là giữ lại từ mức nào trở lên.

Log của server được viết ra file, hoặc gửi tới một dịch vụ thu thập log để lưu giữ.

Cách chỉ đọc phần cuối file được nói tới trong Xem nội dung file — cat / head / tail / wc.

Nơi cần xem được quyết định bởi phía nào đã dừng.

Nếu dừng ở khung bên trái thì xem console của trình duyệt, nếu dừng ở khung bên phải thì xem log của server.

Sau khi công khai, thứ bạn đọc là log

Dòng chữ hiện trên màn hình khi chạy ở máy bạn, sau khi công khai sẽ nằm lại trong log của server.

Một dòng log xếp theo thứ tự thời điểm, mức log rồi nội dung, nên khi tìm thấy dòng ERROR, hãy đọc các dòng quanh nó để biết lúc đó chuyện gì đang diễn ra.

Khi hỏi, bạn cần báo 4 thứ: toàn văn dòng chữ, các bước tái hiện, môi trường và thời điểm

Nếu bạn chỉ nói "gặp lỗi", người trả lời sẽ phải bắt đầu bằng việc hỏi lại bạn.

Họ không nhìn thấy máy tính của bạn, nên điều quyết định là họ có tạo lại được đúng trạng thái đó trên máy mình hay không.

Bốn thứ kèm theo câu hỏi, và điều làm được khi có đủ
Toàn văn dòng chữ(không cắt bớt)Thời điểm xảy ra(để lọc log)Các bước tái hiện(thứ tự thao tác)Nơi đã chạy(máy bạn / công khai)Tìm ra đượclỗi giống hệtLàm lại đượcđúng thao tácNgười trả lờitạo lại trạng thái
Bốn mục bên trái là thứ bạn kèm vào câu hỏi. Hai mục trên và hai mục dưới kết hợp với nhau, và khi có đủ cả hai thì người trả lời tạo lại được đúng trạng thái đó.

Mục thứ hai, các bước tái hiện (steps to reproduce — chuỗi thao tác để tạo lại đúng trạng thái đó), là thứ người trả lời hỏi đầu tiên.

Hãy liệt kê theo thứ tự bạn ở màn hình nào, nhập gì và bấm gì, kèm cả việc lỗi có xảy ra mỗi lần hay không.

Hãy dán cả bốn thứ thành một khối thay vì gửi rời rạc.

Trước khi dán, hãy kiểm tra xem có lẫn tên server đích hay API key nào không.

Một khối duy nhất bạn dán vào câu hỏi
Nội dung câu hỏi
Toàn văn dòng chữ đã hiện
  • Từ dòng TypeError đến các dòng at
  • Đừng chỉ cắt lấy dòng cuối cùng
Các bước tái hiện
  • Đã chọn 12/24 18:00 trên màn hình đặt chỗ
  • Đã bấm nút đăng ký
Nơi bạn đã chạy
  • my-app trên máy bạn, hay server công khai
  • Một dòng lệnh dùng để chạy, ví dụ node app.js
Thời điểm xảy ra
  • 2026-09-03 10:12:05
  • Nhờ đó biết cần xem phần nào của log
Dán cả bốn ở cùng một chỗ. Dán dưới dạng chữ thay vì ảnh chụp màn hình thì người nhận tìm kiếm được từ ngữ trong đó.

Đôi khi không có dòng chữ lỗi nào mà mọi thứ vẫn không chạy như bạn nghĩ.

Màn hình trắng và không có gì xảy ra, hoặc có kết quả nhưng giá trị lại sai.

Những lúc như vậy, hãy tìm xem bản ghi trong log đứt ở chỗ nào.

Đủ 4 thứ thì người kia tạo lại được trạng thái

Bạn cần báo bốn thứ: toàn văn dòng chữ đã hiện, các bước tái hiện, nơi bạn đã chạy và thời điểm xảy ra.

Thứ nào cũng cần cho người trả lời để tạo lại đúng trạng thái đó, nên hãy dán nguyên dòng chữ chứ đừng cắt bớt, và trước khi dán chỉ cần kiểm tra xem có lẫn giá trị bí mật nào không.

QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Trong các dòng chữ hiện ra khi chương trình dừng, thứ nào cho biết nơi nó dừng?

Câu 2Khi lỗi xảy ra trên server công khai, bạn đọc nội dung chi tiết ở đâu?

Câu 3Khi bạn hỏi về một lỗi, người trả lời cần thông tin nào để tạo lại đúng trạng thái đó?