Skip to content
VDS · Giám sát và hiệu năng

Log systemd: journalctl bằng ngôn ngữ đơn giản

Cách tìm nguyên nhân dịch vụ lỗi trong log, lọc những gì bạn cần theo thời gian và mức độ, và ngăn log ăn hết toàn bộ đĩa.

Cập nhật 23 tháng 8, 2026

Gần như mọi thứ xảy ra trên hệ thống đều được ghi vào systemd journal. Một dịch vụ không khởi động, máy tự khởi động lại, trang web trả về 502 — câu trả lời thường đã được ghi lại, bạn chỉ cần biết cách hỏi.

Năm lệnh là đủ

journalctl -u nginx -n 50 --no-pager      # last 50 lines of one service
journalctl -u nginx -f                    # follow in real time
journalctl -p err -b                      # only errors since boot
journalctl --since "10 min ago"           # everything for the last ten minutes
journalctl -b -1 -e                       # previous boot log, end of file

Lệnh cuối đặc biệt hữu ích sau một lần khởi động lại đột ngột: -b -1 mở phiên trước đó, và ở cuối bạn có thể thấy đó là kernel panic, OOM killer hoạt động, hay một lần tắt máy sạch sẽ.

Các mức trong -p: emerg, alert, crit, err, warning, notice, info, debug. Mức được chỉ định bao gồm tất cả các mức quan trọng hơn.

Chẩn đoán một dịch vụ bị lỗi

systemctl status myapp
journalctl -u myapp --since today -p warning

systemctl status cho bạn mã thoát và những dòng cuối, journalctl cho bạn bức tranh đầy đủ. Hãy xem:

  • Main process exited, code=exited, status=1 — ứng dụng tự thoát với lỗi, nguyên nhân nằm ở dòng phía trên;
  • Failed to start ... Permission denied — quyền trên một tệp, thư mục, hoặc một cổng dưới 1024;
  • Killed process ... (java) total-vm... từ kernel — OOM killer đã can thiệp, đọc Hết bộ nhớ;
  • Start request repeated too quickly — dịch vụ đang lặp lại crash, systemd đã ngừng khởi động nó; sửa nguyên nhân và chạy systemctl reset-failed myapp.

Danh sách mọi thứ hỏng trên hệ thống là systemctl --failed.

Các bộ lọc giúp tiết kiệm thời gian

journalctl --since "2026-08-22 03:00" --until "2026-08-22 04:00"
journalctl -u nginx -u php-fpm            # several services at once
journalctl _PID=1432                      # by specific process
journalctl -k                             # only kernel messages
journalctl -u sshd | grep "Failed password" | tail -20

Kết hợp với grep, nhưng hãy nhớ: journalctl không có --no-pager sẽ mở trình phân trang, thoát bằng q.

Giữ cho journal không ăn hết đĩa

Theo mặc định, journal phát triển đến 10% phân vùng. Trên VDS-1 với đĩa 40 GB, đó là bốn gigabyte — đáng chú ý.

journalctl --disk-usage
journalctl --vacuum-size=200M
journalctl --vacuum-time=14d

Giới hạn vĩnh viễn nằm trong /etc/systemd/journald.conf:

[Journal]
SystemMaxUse=300M
MaxRetentionSec=1month

Sau đó systemctl restart systemd-journald.

Những lỗi thường gặp

  • Đọc journal mà không có -u. Luồng chung bị lấp đầy bởi các bản ghi dịch vụ, và dòng bạn cần bị thất lạc. Luôn thu hẹp nó về một dịch vụ hoặc mức.
  • Mất lịch sử sau khi khởi động lại. Nếu thư mục /var/log/journal không tồn tại, journal chỉ sống trong bộ nhớ. Hãy tạo nó: mkdir -p /var/log/journal && systemd-tmpfiles --create --prefix /var/log/journal.
  • Tìm lỗi ứng dụng ở đó. Nginx, PostgreSQL và những thứ tương tự cũng ghi vào các tệp riêng của chúng trong /var/log. Nếu journal trống, hãy kiểm tra ở đó.

Khi đĩa đầy, journalctl có thể từ chối hoạt động cho đến khi dung lượng được giải phóng. Tình huống này được đề cập trong bài viết Hết dung lượng đĩa.