Lệnh journalctl: cách dùng, log theo dịch vụ và dọn dung lượng journal
Lệnh journalctl là công cụ để chọn và đọc các log mà dịch vụ và kernel để lại trong journal của systemd. Trên Linux dùng systemd, systemd-journald gom các log này vào journal. Khi đọc log theo dịch vụ, thời gian và mức độ ưu tiên trên máy chủ AlmaLinux 9 và máy chủ Debian 12, tài khoản thường chỉ thấy log của chính mình, còn máy chủ giữ journal trong bộ nhớ thì không chọn được lần khởi động trước.
Kết quả bên dưới lấy từ hai máy chủ. Tên máy, tài khoản, ID khởi động, số tiến trình trên máy chủ AlmaLinux và bản phát hành gói systemd đã được thay bằng giá trị ví dụ, và cả hai máy chủ đều in thời gian theo UTC.
1️⃣ Cách dùng lệnh journalctl và xem log gần đây
Chạy journalctl không có tùy chọn sẽ mở journal trong less từ dòng cũ nhất, nên khi xem log gần đây hãy đặt số dòng bằng -n. Nếu bỏ số sau -n, sẽ hiện 10 dòng.
journalctl -n 3Oct 28 07:14:06 server1 systemd[1]: session-3017.scope: Deactivated successfully.
Oct 28 07:14:06 server1 systemd[1]: session-3017.scope: Consumed 3.934s CPU time.
Oct 28 07:14:07 server1 sudo[851987]: pam_unix(sudo:session): session closed for user userMỗi dòng gồm thời gian, tên máy, chương trình ghi log cùng số tiến trình, rồi đến thông điệp. Thêm -r thì thứ tự bị đảo và dòng mới nhất lên trên cùng. Trong log crond của máy chủ AlmaLinux, dòng CMDEND được ghi sau cùng nằm trên cùng.
journalctl -r -u crond -n 3Oct 28 07:01:01 server1 CROND[841384]: (root) CMDEND (run-parts /etc/cron.hourly)
Oct 28 07:01:01 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron
Oct 28 07:01:01 server1 CROND[841388]: (root) CMD (run-parts /etc/cron.hourly)-f không thoát sau khi in dòng cuối mà tiếp tục in các dòng mới đến. Trên máy chủ Debian 12, dòng logger cuối cùng được giữ trên màn hình với -q và -t myapp, rồi ghi thêm hai dòng bằng logger. Hai dòng đó hiện ngay bên dưới.
journalctl -q -f -n 1 -t myappOct 28 07:12:46 server2 myapp[347704]: journalctl error test
Oct 28 07:14:35 server2 myapp[347881]: follow line 1
Oct 28 07:14:36 server2 myapp[347877]: follow line 2-f không dừng cho đến khi bạn nhấn Ctrl+C, nên hãy dùng nó để theo dõi log trong lúc dịch vụ khởi động lại.
Trong less, các dòng dài hơn chiều rộng màn hình bị cắt ở bên phải, phần bị cắt xem bằng phím mũi tên. Đầu ra chuyển sang pipe hoặc tệp không đi qua less. Để in thẳng ra terminal mà không qua less, thêm --no-pager.
2️⃣ Log theo dịch vụ với journalctl
Các dòng gần đây trộn log của nhiều dịch vụ, nên để xem log của một dịch vụ, hãy chỉ định tên unit bằng -u. Phần .service ở cuối tên unit có thể bỏ.
journalctl -u crond -n 4Oct 28 06:01:01 server1 CROND[802926]: (root) CMDEND (run-parts /etc/cron.hourly)
Oct 28 07:01:01 server1 CROND[841388]: (root) CMD (run-parts /etc/cron.hourly)
Oct 28 07:01:01 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron
Oct 28 07:01:01 server1 CROND[841384]: (root) CMDEND (run-parts /etc/cron.hourly)Viết -u hai lần thì log của hai dịch vụ ra xen nhau theo thứ tự thời gian. Khi chọn cùng lúc crond và nginx từ 08:00 đến 08:15 ngày 18 tháng 10 trên máy chủ AlmaLinux, sau bốn dòng crond lúc 08:01 là hai dòng nginx reload lúc 08:12.
journalctl -u nginx -u crond --since '2026-10-18 08:00' --until '2026-10-18 08:15'Oct 18 08:01:01 server1 CROND[381522]: (root) CMD (run-parts /etc/cron.hourly)
Oct 18 08:01:01 server1 run-parts[381528]: (/etc/cron.hourly) starting 0anacron
Oct 18 08:01:01 server1 run-parts[381534]: (/etc/cron.hourly) finished 0anacron
Oct 18 08:01:01 server1 CROND[381518]: (root) CMDEND (run-parts /etc/cron.hourly)
Oct 18 08:12:30 server1 systemd[1]: Reloading nginx - high performance web server...
Oct 18 08:12:30 server1 systemd[1]: Reloaded nginx - high performance web server.systemctl status chỉ in 10 dòng log gần nhất bên dưới trạng thái dịch vụ, nên log cũ hơn hãy xem bằng journalctl -u. Ngay sau khi chạy systemctl restart cho một dịch vụ, hãy chạy journalctl -u để kiểm tra log khởi động.
Log mà script hoặc tác vụ cron ghi bằng logger được tìm theo nhãn (định danh), không theo unit. Sau -t, hãy viết đúng tên đã đặt cho -t của logger.
logger -t myapp 'journalctl test message'Trên máy chủ Debian 12, logger không in gì ra màn hình, và các dòng đã ghi được tìm thấy bằng -t myapp.
journalctl -q -t myappOct 28 07:12:44 server2 myapp[347693]: journalctl test message-g chỉ giữ lại các dòng có thông điệp chứa một chuỗi nhất định. Nếu viết chuỗi cần tìm toàn bằng chữ thường thì không phân biệt chữ hoa chữ thường.
journalctl -u crond -g anacron -n 2Oct 28 07:01:01 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron-n đếm dòng trước khi -g lọc, nên trong hai dòng crond cuối chỉ còn lại một dòng có anacron.
3️⃣ Log theo khoảng thời gian và theo lần khởi động
--since và --until đặt điểm đầu và điểm cuối của khoảng thời gian cần in. Nếu giữa ngày và giờ có khoảng trắng, hãy đặt giá trị trong dấu nháy đơn.
| Giá trị --since | Ý nghĩa và khi nào dùng |
|---|---|
| '2026-10-28 06:00' | Từ 06:00:00 ngày đó (không ghi giây thì là 00), khi bạn biết giờ sự cố bắt đầu |
| today | Từ 00:00:00 hôm nay, để chỉ xem log hôm nay |
| yesterday | Từ 00:00:00 hôm qua đến bây giờ; muốn chỉ xem hôm qua thì thêm --until today |
| '-2h' | Từ 2 giờ trước, để xem việc vừa xảy ra (đo ở dưới) |
| '1 hour ago' | Từ 1 giờ trước, cùng nghĩa với -1h |
Trên máy chủ AlmaLinux, 2 giờ gần nhất bắt đầu từ các dòng crond ghi lúc 06:01; bên dưới là bốn dòng đầu trong số đó.
journalctl -u crond --since '-2h' | head -4Oct 28 06:01:01 server1 CROND[802930]: (root) CMD (run-parts /etc/cron.hourly)
Oct 28 06:01:01 server1 run-parts[802936]: (/etc/cron.hourly) starting 0anacron
Oct 28 06:01:01 server1 CROND[802926]: (root) CMDEND (run-parts /etc/cron.hourly)
Oct 28 07:01:01 server1 CROND[841388]: (root) CMD (run-parts /etc/cron.hourly)-b chỉ giữ log kể từ lần khởi động hiện tại. Khi tìm nguyên nhân máy chủ khởi động lại, trước hết hãy xem danh sách khởi động để biết log của lần khởi động trước còn hay không.
journalctl -b -u crond -n 2Oct 28 07:01:01 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron
Oct 28 07:01:01 server1 CROND[841384]: (root) CMDEND (run-parts /etc/cron.hourly)--list-boots in ra, cho mỗi lần khởi động còn trong journal, số thứ tự, ID khởi động và thời gian của dòng đầu và dòng cuối.
journalctl --list-bootsIDX BOOT ID FIRST ENTRY LAST ENTRY
0 4f1c2a9be0d34c7a8e6b5d20c1f3a7e9 Sat 2026-10-17 08:29:26 UTC Wed 2026-10-28 07:16:10 UTCMáy chủ AlmaLinux không lưu journal trên đĩa nên chỉ có một bản ghi khởi động. Vì vậy -b -1 cho lần khởi động trước chỉ để lại một thông báo rồi kết thúc.
journalctl -b -1Specifying boot ID or boot offset has no effect, no persistent journal was found.Log của lần khởi động trước chỉ đọc được bằng -b -1 trên máy chủ lưu journal trên đĩa (/var/log/journal).
4️⃣ Log lỗi và log kernel với journalctl
-p chọn dòng theo mức độ ưu tiên của log. Ghi một mức thì sẽ hiện mức đó và mọi mức quan trọng hơn, và mức có thể viết bằng tên hoặc bằng số.
| Mức | Chuỗi mã bài viết | Ý nghĩa |
|---|---|---|
| emerg | 0 | Hệ thống không dùng được |
| alert | 1 | Cần xử lý ngay |
| crit | 2 | Lỗi nghiêm trọng |
| err | 3 | Lỗi |
| warning | 4 | Cảnh báo |
| notice | 5 | Bình thường nhưng đáng chú ý; mức của các dòng logger ghi khi không có -p |
| info | 6 | Thông tin |
| debug | 7 | Thông điệp gỡ lỗi |
Sau khi ghi một dòng mức err bằng logger rồi chọn bằng -p err, dòng mức notice cùng nhãn (journalctl test message) bị loại và chỉ còn dòng err.
logger -t myapp -p user.err 'journalctl error test'; journalctl -q -t myapp -p errOct 28 07:12:46 server2 myapp[347704]: journalctl error testNối hai mức bằng hai dấu chấm thì chỉ in khoảng đó. Chọn warning..err thì chỉ còn các mức cảnh báo và lỗi.
journalctl -q -t myapp -p warning..errOct 28 07:12:46 server2 myapp[347704]: journalctl error test-k chỉ giữ thông điệp kernel và chỉ in các dòng kể từ lần khởi động hiện tại.
journalctl -k -n 3Oct 26 10:14:25 server1 systemd-rc-local-generator[96245]: /etc/rc.d/rc.local is not marked executable, skipping.
Oct 27 10:47:57 server1 systemd-rc-local-generator[512078]: /etc/rc.d/rc.local is not marked executable, skipping.
Oct 27 11:01:10 server1 systemd-rc-local-generator[520023]: /etc/rc.d/rc.local is not marked executable, skipping.Ba dòng -k cuối trên máy chủ AlmaLinux đều là dòng systemd-rc-local-generator. Đây là các thông điệp ghi vào bộ đệm log của kernel nên được lưu với _TRANSPORT là kernel và cũng hiện trong -k.
5️⃣ Định dạng đầu ra của journalctl
-o đổi định dạng của mỗi dòng. Giá trị mặc định short gần giống tệp syslog, còn short-iso đổi thời gian sang định dạng ISO 8601 kèm múi giờ. Khi chuyển sang short-iso trên máy chủ AlmaLinux, cuối thời gian có thêm +0000.
journalctl -u crond -n 2 -o short-iso2026-10-28T07:01:01+0000 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron
2026-10-28T07:01:01+0000 server1 CROND[841384]: (root) CMDEND (run-parts /etc/cron.hourly)cat bỏ thời gian và tên máy, chỉ in thông điệp, nên dùng khi chuyển thông điệp cho grep hoặc chương trình khác.
journalctl -u crond -n 2 -o cat(/etc/cron.hourly) starting 0anacron
(root) CMDEND (run-parts /etc/cron.hourly)json và json-pretty in các trường lưu trong journal dưới dạng tên và giá trị. Khi chọn trường bằng --output-fields, các trường con trỏ, thời gian và ID khởi động luôn đi kèm. Ngay cả khi chỉ chọn bốn trường trên máy chủ Debian 12, __CURSOR, _BOOT_ID và hai trường thời gian vẫn hiện cùng.
journalctl -q -t myapp -n 1 -o json-pretty --output-fields=MESSAGE,PRIORITY,SYSLOG_IDENTIFIER,_PID{
"__REALTIME_TIMESTAMP" : "1793171676664200",
"_PID" : "347877",
"SYSLOG_IDENTIFIER" : "myapp",
"MESSAGE" : "follow line 2",
"__CURSOR" : "s=2a6f0c1d9e8b47a3b5c4d3e2f1a0b9c8;i=1a2b3;b=b7e3d1a04c9f4e2a8d6c5b1f0e2a9c47;m=17cf8fe36f5;t=65ee150cf1188;x=1f2e3d4c5b6a7980",
"_BOOT_ID" : "b7e3d1a04c9f4e2a8d6c5b1f0e2a9c47",
"PRIORITY" : "5",
"__MONOTONIC_TIMESTAMP" : "1636264982261"
}6️⃣ Nơi lưu journal và dọn dung lượng
Journal nằm trong bộ nhớ hay trên đĩa do giá trị Storage= trong journald.conf quyết định. Giá trị mặc định auto lưu trên đĩa nếu có thư mục /var/log/journal, nếu không thì lưu trong bộ nhớ (/run/log/journal).
Máy chủ AlmaLinux không có thư mục /var/log/journal nên journal chỉ nằm ở /run/log/journal.
ls -ld /var/log/journal /run/log/journalls: cannot access '/var/log/journal': No such file or directory
drwxr-sr-x+ 4 root systemd-journal 80 Oct 17 08:30 /run/log/journalMáy chủ Debian 12 có cả hai thư mục, và journal đang dồn lên trên đĩa.
ls -ld /var/log/journal /run/log/journaldrwxr-sr-x+ 2 root systemd-journal 40 Oct 9 08:43 /run/log/journal
drwxr-sr-x+ 4 root systemd-journal 4096 Sep 24 12:52 /var/log/journalĐể giữ log sau khi khởi động lại, đổi Storage= trong journald.conf thành persistent rồi khởi động lại systemd-journald. Theo hướng dẫn chính thức, thư mục /var/log/journal được tạo tự động khi cần. Bài viết này không thay đổi cấu hình.
Journal lưu trên đĩa giống như hộp đen máy bay, được lấy ra đọc sau sự cố.
--disk-usage in tổng kích thước của các tệp journal đã lưu trữ và các tệp đang dùng. Trên một tài khoản thường của máy chủ Debian 12, khi ẩn thông báo [Hint] ở trên cùng bằng -q, kết quả là một dòng: 6.6M.
journalctl -q --disk-usageArchived and active journals take up 6.6M in the file system.Kích thước tối đa của journal lưu trên đĩa được đặt bằng SystemMaxUse=. Nếu không ghi giá trị, giới hạn là 10 phần trăm kích thước hệ thống tệp (tối đa 4G), và trong journald.conf của máy chủ Debian 12 có ghi 50M.
grep -v '^#' /etc/systemd/journald.conf | grep -v '^$'[Journal]
SystemMaxUse=50MĐể thu nhỏ ngay journal cũ, đặt kích thước cần giữ bằng --vacuum-size hoặc khoảng thời gian cần giữ bằng --vacuum-time. Hai lệnh này xóa tệp journal nên bài viết này không chạy.
journalctl --vacuum-size=200M--vacuum-size=200M xóa các tệp journal đã lưu trữ từ cũ nhất cho đến khi tổng kích thước dưới 200M.
journalctl --vacuum-time=2weeks--vacuum-time=2weeks xóa các tệp lưu trữ chỉ chứa những dòng cũ hơn 2 tuần.
vacuum chỉ xóa tệp đã lưu trữ và giữ lại tệp đang dùng, nên kể cả sau khi chạy, con số --disk-usage có thể không giảm xuống đến kích thước đã đặt.
Log văn bản dưới /var/log do rsyslog ghi, và nó hoạt động tách biệt với journald. Vì vậy hai loại log này có cách đọc và cách quản lý dung lượng khác nhau.
| Hạng mục | journald(journalctl) | rsyslog |
|---|---|---|
| Cách đọc | journalctl | cat, less, grep |
| Nơi lưu | /run/log/journal hoặc /var/log/journal | /var/log/messages (họ RHEL) hoặc /var/log/syslog (họ Debian) |
| Quản lý dung lượng | SystemMaxUse và các mục khác trong journald.conf | logrotate |
7️⃣ Quyền đọc và tùy chọn của lệnh journalctl
🔲 Quyền đọc
Chạy journalctl bằng tài khoản không phải root sẽ hiện dòng [Hint] ở trên cùng và chỉ thấy log do tài khoản đó ghi. Khi tìm log nginx bằng tài khoản thường trên máy chủ Debian 12, sau thông báo chỉ hiện [-- No entries --].
journalctl -u nginx -n 5Hint: You are currently not seeing messages from other users and the system.
Users in groups 'adm', 'systemd-journal' can see all messages.
Pass -q to turn off this notice.
-- No entries --Theo id -nG, tài khoản này chỉ thuộc một nhóm, và không nằm trong nhóm adm hay systemd-journal mà thông báo nhắc đến.
id -nGuserHướng dẫn chính thức giải thích rằng tài khoản thuộc nhóm systemd-journal, adm và wheel đọc được toàn bộ journal. adm và wheel còn kèm các quyền khác do bản phân phối quy định, và wheel thường cho phép cả việc quản trị, nên với tài khoản chỉ đọc log thì nhóm systemd-journal là phù hợp.
usermod -aG systemd-journal userLệnh usermod thêm nhóm không được chạy trong bài viết này. Sau khi thêm nhóm, hãy đăng nhập lại và kiểm tra nhóm bằng id -nG. Tài khoản có quyền quản trị cũng thấy toàn bộ log khi chạy sudo journalctl.
Dòng [Hint] được ẩn bằng -q. Tuy vậy, dù có -q, log hiện ra vẫn chỉ là các dòng tài khoản đó ghi. --user đọc journal người dùng của tài khoản đó và chỉ hoạt động trên máy chủ lưu journal trên đĩa. Trên máy chủ Debian 12 lưu journal trên đĩa, các dòng systemd và dòng logger của tài khoản đó đã hiện ra.
journalctl --user -n 3Oct 28 07:12:35 server2 systemd[347665]: Reached target default.target - Main User Target.
Oct 28 07:12:35 server2 systemd[347665]: Startup finished in 181ms.
Oct 28 07:12:44 server2 myapp[347693]: journalctl test message🔲 Tùy chọn của lệnh journalctl
📌 Tùy chọn chính: kết quả chạy trong bài này
| Tùy chọn | Chức năng | Kết quả trong bài này | |
|---|---|---|---|
| -n số dòng | Chỉ in vài dòng cuối; bỏ số thì 10 dòng | -n 3 hiện ba dòng cuối | |
| -r | Đảo thứ tự, dòng mới nhất lên trên cùng | Trong log crond, dòng CMDEND ghi sau cùng nằm trên cùng | |
| -f | Tiếp tục in các dòng mới sau dòng cuối | Hai dòng ghi bằng logger hiện ngay bên dưới | |
| -q | Ẩn các thông báo như [Hint] | Kết quả --disk-usage của tài khoản thường Debian 12 chỉ còn một dòng: 6.6M | |
| -u unit | Chỉ in log của dịch vụ đó | Viết -u hai lần thì sau bốn dòng crond là hai dòng nginx reload theo thứ tự thời gian | |
| -t nhãn | Chỉ in log có nhãn đặt cho logger -t | -t myapp hiện các dòng ghi bằng logger | |
| -g chuỗi | Chỉ in các dòng có thông điệp chứa chuỗi đó | Trong hai dòng crond cuối, chỉ còn dòng có anacron | |
| --since, --until | Điểm đầu và điểm cuối của khoảng thời gian cần in | --since '-2h' bắt đầu từ các dòng crond ghi lúc 06:01 | |
| -b | Chỉ log kể từ lần khởi động hiện tại; -b -1 là lần khởi động trước | Trên máy chủ AlmaLinux không lưu journal trên đĩa, -b -1 chỉ hiện thông báo [no persistent journal was found] | |
| --list-boots | Danh sách các lần khởi động còn trong journal | Máy chủ AlmaLinux chỉ có một bản ghi khởi động | |
| -p mức | Chỉ in mức ưu tiên đó và các mức quan trọng hơn | -p err loại dòng notice và chỉ còn dòng err; warning..err cũng cho cùng một dòng | |
| -k | Chỉ in thông điệp kernel của lần khởi động hiện tại | Ba dòng cuối đều là dòng systemd-rc-local-generator | |
| -o định dạng | Đổi định dạng đầu ra của mỗi dòng | short-iso thêm +0000 vào cuối thời gian; cat chỉ còn thông điệp | |
| --output-fields trường | Chọn trường trong đầu ra json | Dù chỉ chọn bốn trường, __CURSOR, _BOOT_ID và hai trường thời gian vẫn đi kèm | |
| --disk-usage | In tổng kích thước mà các tệp journal chiếm | 6.6M trên tài khoản thường của máy chủ Debian 12 | |
| --user | Đọc journal người dùng của tài khoản đó | Trên máy chủ Debian 12 hiện các dòng systemd và dòng logger của tài khoản đó | |
| --utc | In thời gian theo UTC | Ngay cả trên máy chủ AlmaLinux có múi giờ riêng, thời gian trong log crond cũng chuyển sang UTC | |
| trường=giá trị | Chỉ in các dòng có giá trị trường đó | _PID=347704 chỉ hiện một dòng err do logger ghi |
📎 Tùy chọn khác: theo tài liệu hướng dẫn chính thức
| Tùy chọn | Chức năng | |
|---|---|---|
| --no-pager | In thẳng ra terminal mà không qua less | |
| -e, --pager-end | Mở less ở cuối journal; không ghi -n thì 1000 dòng | |
| -x, --catalog | Thêm văn bản giải thích trong danh mục thông điệp vào dòng log | |
| -a, --all | In đầy đủ các trường, kể cả khi có ký tự không in được hoặc rất dài | |
| -N, --fields | In tất cả tên trường dùng trong journal | |
| -F, --field= trường | In tất cả giá trị mà trường đó có | |
| -D thư mục | Đọc journal trong thư mục chỉ định thay cho vị trí mặc định | |
| --file= tệp | Đọc tệp journal chỉ định; có thể ghi nhiều lần | |
| --vacuum-size= kích thước | Xóa các tệp journal đã lưu trữ từ cũ nhất cho đến dưới kích thước chỉ định | |
| --vacuum-time= khoảng thời gian | Xóa các tệp lưu trữ chỉ chứa dòng cũ hơn khoảng thời gian chỉ định | |
| --vacuum-files= số lượng | Xóa các tệp journal đã lưu trữ, chỉ giữ lại số lượng chỉ định | |
| --rotate | Chuyển các tệp journal đang dùng thành tệp lưu trữ và bắt đầu tệp mới | |
| --flush | Chuyển journal từ bộ nhớ (/run/log/journal) sang đĩa (/var/log/journal), khi lưu kiểu persistent |
🔲 Trình mô phỏng lệnh journalctl
Trong trình mô phỏng bên dưới, bạn có thể tự gõ lệnh để kiểm tra log gần đây, log theo dịch vụ, khoảng thời gian, mức ưu tiên và định dạng đầu ra.
🔢 FAQ & nội dung đề xuất








ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.