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
journalctllà 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 và --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 systemctl và journalctl, 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


