IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series: Raspberry Pi OS – Bài 15: Xem log và chẩn đoán lỗi với journalctl

Khi Raspberry Pi gặp lỗi như không vào mạng, service tự dừng, app Python không chạy nền, SSH bị ngắt, hoặc boot lên chậm bất thường, thứ bạn cần xem đầu tiên thường không phải là đoán mò, mà là log. Trên hệ Linux dùng systemd, công cụ chuẩn để đọc log là journalctl. Tài liệu chính thức của systemd mô tả journalctl là lệnh dùng để in ra các bản ghi log được lưu bởi systemd-journald.

Mục tiêu sau bài học

Sau khi hoàn thành bài này, bạn nên đạt được các mục tiêu sau:

  • hiểu journalctl là gì và vì sao nó quan trọng
  • biết xem log toàn hệ thống trên Raspberry Pi
  • biết lọc log theo service
  • biết xem log của lần boot hiện tại và lần boot trước
  • biết lọc log theo thời gian và theo số dòng
  • biết cách theo dõi log theo thời gian thực để debug
  • hiểu một số lỗi thường gặp khi đọc log trên Raspberry Pi

journalctl là gì?

journalctl là công cụ đọc log từ systemd journal. Journal này là nơi systemd-journald thu thập và lưu dữ liệu log từ hệ thống và các service. So với cách chỉ nhìn vài dòng báo lỗi trên màn hình, journalctl cho bạn cái nhìn đầy đủ hơn về những gì đã xảy ra trước, trong và sau khi lỗi xuất hiện.

Vì sao người dùng Raspberry Pi nên biết journalctl?

Khi bạn bắt đầu dùng Raspberry Pi cho các việc như:

  • chạy SSH headless
  • làm MQTT gateway
  • chạy app Python hoặc Node.js dưới dạng service
  • quản lý mạng với NetworkManager
  • debug boot hoặc service lỗi

thì log trở thành nguồn thông tin quan trọng nhất để biết hệ thống đang làm gì và lỗi nằm ở đâu. Trong cộng đồng Raspberry Pi, khi người dùng hỏi về lỗi service, lỗi mạng hoặc lỗi boot trên các bản OS mới, journalctl là một trong những công cụ được nhắc đến thường xuyên nhất.

Cách xem toàn bộ log gần đây

Lệnh cơ bản nhất là:

journalctl

Lệnh này sẽ in ra nội dung journal mà systemd-journald đang lưu. Vì output có thể rất dài, trong thực tế bạn thường kết hợp thêm tùy chọn lọc thay vì đọc toàn bộ từ đầu đến cuối. Tài liệu chính thức của journalctl mô tả đây là cách truy vấn nội dung journal.

Cách xem log mới nhất

Khi bạn chỉ muốn xem phần log gần đây nhất, dùng:

journalctl -n 100

Lệnh này sẽ hiển thị 100 dòng log cuối. Trong trao đổi hỗ trợ trên Raspberry Pi Forums, journalctl -n 1000 cũng được khuyên dùng để nhanh chóng xem các log gần nhất khi debug máy headless.

Cách theo dõi log theo thời gian thực

Nếu bạn đang restart service hoặc chờ lỗi xuất hiện, cách rất tiện là xem log “live”:

journalctl -f

Tùy chọn -f hoạt động theo kiểu follow, tương tự tail -f, và được tài liệu chính thức hỗ trợ như một cách theo dõi log liên tục khi journal có thêm bản ghi mới.

Cách xem log của một service cụ thể

Đây là một trong những cách dùng quan trọng nhất trên Raspberry Pi. Nếu bạn muốn xem log của một service, dùng:

sudo journalctl -u <ten-service>

Ví dụ:

sudo journalctl -u ssh
sudo journalctl -u NetworkManager

Tài liệu journalctl hỗ trợ lọc theo unit, và đây cũng là cách tiêu chuẩn để xem log của service do systemd quản lý.

Cách xem log service theo thời gian thực

Nếu bạn đang debug một service và muốn vừa restart vừa nhìn log chạy ra ngay, dùng:

sudo journalctl -u <ten-service> -f

Ví dụ:

sudo journalctl -u myapp.service -f

Đây là cách rất thực tế khi bạn đang sửa file cấu hình, restart app, rồi muốn biết service fail ở bước nào. Vì systemctl quản lý service còn journalctl đọc log của service đó, hai công cụ này gần như luôn đi cùng nhau trong quá trình debug.

Cách xem log của lần boot hiện tại

Khi bạn muốn tập trung vào những gì xảy ra từ lúc Raspberry Pi boot lên lần này, dùng:

journalctl -b

Tùy chọn -b lọc log theo boot hiện tại. Đây là một cách rất hữu ích để loại bỏ log cũ và chỉ nhìn vào chuỗi sự kiện của lần khởi động đang xét. Tài liệu chính thức của journalctl hỗ trợ lọc theo boot ID hoặc boot offset.

Cách xem log của lần boot trước

Nếu Raspberry Pi vừa reboot bất thường hoặc service fail ở boot trước, bạn có thể thử:

journalctl -b -1

Lệnh này yêu cầu journal của boot trước phải còn được lưu. Trên Raspberry Pi Forums có các trường hợp người dùng chạy journalctl -b -1 nhưng nhận thông báo rằng không có persistent journal, nghĩa là log boot trước không còn sẵn để đọc.

Vì sao đôi khi không xem được log boot trước?

Không phải lúc nào journal cũng được lưu bền vững giữa các lần reboot. Tài liệu journald.conf cho biết cách lưu trữ journal có thể được cấu hình bằng tham số Storage=. Trên Raspberry Pi Forums, cũng có các thảo luận chỉ ra rằng nếu journal đang ở chế độ volatile, log có thể mất sau khi reboot.

Điều này có nghĩa là nếu bạn thử:

journalctl -b -1

mà không thấy log boot trước, lý do có thể không phải do lệnh sai, mà do journal chưa được lưu persistent.

Cách lọc log theo thời gian

Bạn có thể lọc log từ một mốc thời gian nhất định bằng:

journalctl --since "2026-04-14 08:00:00"

Hoặc theo khoảng thời gian:

journalctl --since "today"
journalctl --since "1 hour ago"
journalctl --until "2026-04-14 10:00:00"

Tài liệu journalctl hỗ trợ rõ các tùy chọn --since--until để truy vấn journal theo khoảng thời gian. Đây là cách rất hữu ích khi bạn biết lỗi xảy ra gần thời điểm nào.

Cách lọc log của service trong một khoảng thời gian

Bạn có thể kết hợp cả hai kiểu lọc:

sudo journalctl -u myapp.service --since "10 minutes ago"

Hoặc:

sudo journalctl -u ssh --since "today"

Cách này rất hợp khi service chạy lâu nhưng bạn chỉ muốn nhìn phần lỗi mới nhất. Vì journalctl cho phép kết hợp nhiều bộ lọc trong cùng một truy vấn, đây là một workflow rất mạnh khi debug trên Raspberry Pi.

Cách xem log “cuối file” dễ hơn

Nếu output quá dài, bạn có thể dùng:

journalctl -e

Tùy chọn -e đưa bạn tới cuối journal. Đây là cách nhanh để nhảy tới các dòng mới nhất mà không phải cuộn tay quá nhiều. Tài liệu chính thức của journalctl hỗ trợ tùy chọn này.

Khi nào nên dùng dmesg thay vì journalctl?

Nếu bạn nghi lỗi liên quan đến kernel, driver, USB, thiết bị phần cứng hoặc boot rất sớm, dmesg vẫn hữu ích. Trong một trao đổi hỗ trợ trên Raspberry Pi Forums, moderator cũng nhắc rằng dmesg in ra kernel messages, một phần trong số đó có thể không phản ánh đầy đủ theo cách bạn đang tìm trong system log.

Quy tắc đơn giản:

  • lỗi service, app, SSH, network manager → ưu tiên journalctl
  • lỗi kernel, driver, thiết bị phần cứng → kiểm tra thêm dmesg

Một quy trình debug service rất thực tế

Khi service trên Raspberry Pi bị lỗi, bạn có thể đi theo flow này:

Bước 1: xem trạng thái service

sudo systemctl status myapp.service

Bước 2: xem log service

sudo journalctl -u myapp.service

Bước 3: xem log mới nhất theo thời gian thực

sudo journalctl -u myapp.service -f

Bước 4: restart service rồi quan sát log

sudo systemctl restart myapp.service

Đây là workflow chuẩn giữa systemctljournalctl, phù hợp với cách systemd quản lý service và log.

Một số lệnh rất nên nhớ

Xem 100 dòng log cuối

journalctl -n 100

Theo dõi log live

journalctl -f

Xem log của service

sudo journalctl -u ssh

Xem log của lần boot hiện tại

journalctl -b

Xem log boot trước

journalctl -b -1

Lọc theo thời gian

journalctl --since "1 hour ago"

Xem log service từ 10 phút gần đây

sudo journalctl -u myapp.service --since "10 minutes ago"

Tất cả các kiểu truy vấn trên đều nằm trong nhóm tính năng chuẩn của journalctl.

Những lỗi thường gặp khi dùng journalctl

1. Chỉ chạy journalctl rồi bị ngợp vì quá nhiều log

Đây là lỗi phổ biến nhất. Thay vì đọc toàn bộ, hãy lọc theo -u, -b, -n, --since.

2. Quên dùng sudo khi xem log service hệ thống

Một số log có thể cần quyền cao hơn để xem đầy đủ.

3. Mong journalctl -b -1 luôn có dữ liệu

Không đúng. Nếu journal không được lưu persistent, log boot trước có thể không còn. Raspberry Pi Forums có ví dụ cụ thể về tình huống này.

4. Chỉ nhìn systemctl status mà không mở journalctl

status hữu ích, nhưng thường chỉ hiển thị một phần log gần nhất. Khi cần hiểu sâu hơn, journalctl mới là nơi cần đọc kỹ.

5. Muốn đọc log từ thẻ SD gắn sang máy Linux khác

Điều này vẫn có thể làm được. Trên Raspberry Pi Forums có hướng dẫn dùng journalctl -D /path/to/var/log/journal để đọc journal từ một filesystem đã mount.

Một checklist debug nhanh với journalctl

[ ] Biết service nào đang lỗi
[ ] Chạy systemctl status <service>
[ ] Chạy journalctl -u <service>
[ ] Nếu cần, dùng journalctl -u <service> -f
[ ] Nếu lỗi liên quan boot, thử journalctl -b
[ ] Nếu cần log boot trước, thử journalctl -b -1
[ ] Nếu quá nhiều log, lọc theo --since hoặc -n

Kết luận

journalctl là một trong những công cụ quan trọng nhất để debug Raspberry Pi hiện đại, đặc biệt khi bạn dùng headless, service nền, hoặc các app chạy bằng systemd. Chỉ cần nắm chắc các lệnh như journalctl -u, journalctl -b, journalctl -n, journalctl -f, bạn đã có thể đọc log theo đúng thứ mình cần thay vì mò lỗi một cách cảm tính. Đồng thời, cũng nên nhớ rằng khả năng xem log của boot trước còn phụ thuộc vào cách journal đang được lưu trữ.

Bài tiếp theo

Bài 16: Các thư mục quan trọng trên Raspberry Pi OS mà bạn nên biết