journalctl 指令:用法、各服務日誌與日誌容量整理
journalctl 指令是從 systemd 日誌中挑出並閱讀服務與核心所留下日誌的工具。在使用 systemd 的 Linux 上,systemd-journald 會把這些日誌集中到日誌裡。在 AlmaLinux 9 伺服器與 Debian 12 伺服器上依服務、時間與優先等級挑選日誌來讀後發現,一般帳號只看得到自己的日誌,而把日誌放在記憶體中的伺服器無法選擇先前的開機。
以下輸出來自兩台伺服器。主機名稱、帳號、開機 ID、AlmaLinux 伺服器的程序編號與 systemd 套件的發行版本都換成了範例值,兩台伺服器的時間都以 UTC 輸出。
1️⃣ journalctl 指令用法與最近的日誌
不加選項執行 journalctl 時,日誌會從最舊的一行開始在 less 畫面中開啟,所以要看最近的日誌時,請用 -n 指定行數。-n 後面省略數字時會顯示 10 行。
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 user每一行依序由時間、主機名稱、留下日誌的程式與程序編號、訊息組成。加上 -r 會反轉順序,讓最新的一行排到最上面。在 AlmaLinux 伺服器的 crond 日誌中,最後寫入的 CMDEND 行位於最上面。
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 在輸出最後一行後不會結束,而是持續輸出新進來的行。在 Debian 12 伺服器上用 -q 與 -t myapp 讓 logger 的最後一行留在畫面上,再用 logger 多寫兩行,這兩行立刻接在下方出現。
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 在按下 Ctrl+C 之前不會停止,所以適合在服務重新啟動時盯著日誌。
在 less 畫面中,比畫面寬的行會在右側被截斷,截斷的部分可用方向鍵查看。把輸出送到管線或檔案時不會經過 less。若要不經 less 直接顯示在終端機上,請加上 --no-pager。
2️⃣ journalctl 各服務日誌
最近的行會混雜多個服務的日誌,所以要看單一服務的日誌時,請用 -u 指定單元名稱。單元名稱結尾的 .service 可以省略。
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)寫兩次 -u 時,兩個服務的日誌會依時間順序混在一起輸出。在 AlmaLinux 伺服器上一起挑選 10 月 18 日 08:00 到 08:15 的 crond 與 nginx 後,08:01 的四行 crond 之後接著 08:12 的兩行 nginx reload。
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 只會在服務狀態下方附上最近 10 行日誌,所以更早的日誌請用 journalctl -u 查看。對服務執行 systemctl restart 之後,請馬上執行 journalctl -u 確認啟動日誌。
腳本或 cron 工作用 logger 留下的日誌,要用標籤(識別碼)而不是單元來找。-t 後面請照寫 logger 的 -t 所用的名稱。
logger -t myapp 'journalctl test message'在 Debian 12 伺服器上,logger 沒有在畫面上輸出任何東西,寫入的行是用 -t myapp 找到的。
journalctl -q -t myappOct 28 07:12:44 server2 myapp[347693]: journalctl test message-g 只留下訊息中含有特定文字的行。要找的文字全部用小寫寫的話,就不區分大小寫。
journalctl -u crond -g anacron -n 2Oct 28 07:01:01 server1 run-parts[841394]: (/etc/cron.hourly) starting 0anacron-n 是在 -g 篩選之前計算行數,所以 crond 最後兩行之中只剩下含有 anacron 的那一行。
3️⃣ 依時間範圍與開機查看日誌
--since 與 --until 指定要輸出的時間範圍的起點與終點。日期與時間之間有空格時,請用單引號括起來。
| --since 值 | 意思與使用時機 |
|---|---|
| '2026-10-28 06:00' | 從當天 06:00:00 開始(沒寫秒數就是 00 秒),知道問題發生時間時 |
| today | 從今天 00:00:00 開始,只看今天的日誌時 |
| yesterday | 從昨天 00:00:00 到現在;只看昨天一天時請一起加上 --until today |
| '-2h' | 從 2 小時前開始,看剛剛發生的事時(下方實測) |
| '1 hour ago' | 從 1 小時前開始,與 -1h 意思相同 |
在 AlmaLinux 伺服器上,最近 2 小時從 06:01 寫入的 crond 行開始,下方是其中的前四行。
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 只留下目前開機之後的日誌。要找出伺服器重新開機的原因時,請先從開機清單確認先前開機的日誌是否還在。
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 會針對日誌中留下的每次開機,輸出編號、開機 ID 以及第一行與最後一行的時間。
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 UTCAlmaLinux 伺服器沒有把日誌放在磁碟上,所以只有一筆開機紀錄。因此指定先前開機的 -b -1 只留下提示訊息就結束了。
journalctl -b -1Specifying boot ID or boot offset has no effect, no persistent journal was found.先前開機的日誌,只有在把日誌存到磁碟(/var/log/journal)的伺服器上才能用 -b -1 讀取。
4️⃣ journalctl 錯誤日誌與核心日誌
-p 依日誌的優先等級挑選行。寫一個等級時,會顯示該等級以及比它更重要的所有等級,等級用名稱或數字寫都可以。
| 等級 | 純數值 | 說明 |
|---|---|---|
| emerg | 0 | 系統無法使用的狀態 |
| alert | 1 | 需要立即處理的狀態 |
| crit | 2 | 嚴重錯誤 |
| err | 3 | 錯誤 |
| warning | 4 | 警告 |
| notice | 5 | 正常但值得留意,不加 -p 時 logger 留下的行的等級 |
| info | 6 | 網站資訊 |
| debug | 7 | 除錯訊息 |
用 logger 留下一行 err 等級後再用 -p err 挑選,同一標籤的 notice 等級行(journalctl test message)就被排除,只剩下 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 test用兩個點連接兩個等級時,只會輸出該範圍。挑選 warning..err 時只留下警告與錯誤等級。
journalctl -q -t myapp -p warning..errOct 28 07:12:46 server2 myapp[347704]: journalctl error test-k 只留下核心訊息,並且只輸出目前開機之後的行。
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.AlmaLinux 伺服器 -k 的最後三行全都是 systemd-rc-local-generator 的行。這些行是寫進核心日誌緩衝區的訊息,所以 _TRANSPORT 值存成 kernel,也會出現在 -k 中。
5️⃣ journalctl 輸出格式
-o 會改變每一行的格式。預設值 short 與 syslog 檔案幾乎相同,short-iso 則把時間改成 ISO 8601 格式並附上時區。在 AlmaLinux 伺服器上改成 short-iso 後,時間結尾多了 +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 會拿掉時間與主機名稱,只輸出訊息,所以適合在把訊息交給 grep 或其他程式時使用。
journalctl -u crond -n 2 -o cat(/etc/cron.hourly) starting 0anacron
(root) CMDEND (run-parts /etc/cron.hourly)json 與 json-pretty 會把日誌中儲存的欄位以名稱與值輸出。用 --output-fields 挑選欄位時,游標、時間與開機 ID 欄位一定會跟著出現。在 Debian 12 伺服器上只挑四個欄位時,__CURSOR、_BOOT_ID 與兩個時間欄位也一起出現了。
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️⃣ 日誌的儲存位置與容量整理
日誌放在記憶體還是磁碟,由 journald.conf 的 Storage= 值決定。預設值 auto 在 /var/log/journal 資料夾存在時存到磁碟,不存在時存到記憶體(/run/log/journal)。
AlmaLinux 伺服器沒有 /var/log/journal 資料夾,日誌只在 /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/journalDebian 12 伺服器兩個資料夾都有,日誌一直累積在磁碟上。
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要在重新開機後仍保留日誌,請把 journald.conf 的 Storage= 改成 persistent,然後重新啟動 systemd-journald。依官方手冊,/var/log/journal 資料夾在需要時會自動建立。本文沒有變更設定。
留在磁碟上的日誌就像事故後取出來讀的飛機黑盒子。
--disk-usage 會輸出已封存的日誌檔案與目前正在使用的檔案合計大小。在 Debian 12 伺服器的一般帳號上,用 -q 隱藏最上方的 [Hint] 提示後,結果只有一行 6.6M。
journalctl -q --disk-usageArchived and active journals take up 6.6M in the file system.存到磁碟的日誌最大大小由 SystemMaxUse= 決定。不寫值時,上限是檔案系統大小的百分之 10(最多 4G),Debian 12 伺服器的 journald.conf 中寫的是 50M。
grep -v '^#' /etc/systemd/journald.conf | grep -v '^$'[Journal]
SystemMaxUse=50M要立即縮減舊日誌時,請用 --vacuum-size 指定要保留的大小,或用 --vacuum-time 指定要保留的期間。這兩個指令會刪除日誌檔案,所以本文沒有執行。
journalctl --vacuum-size=200M--vacuum-size=200M 會從最舊的開始刪除已封存的日誌檔案,直到總大小低於 200M。
journalctl --vacuum-time=2weeks--vacuum-time=2weeks 會刪除只含有超過 2 週的行的封存檔案。
vacuum 只刪除已封存的檔案,目前正在使用的檔案會保留,所以執行後 --disk-usage 的數字也可能不會降到指定的大小。
寫入 /var/log 下文字日誌的 rsyslog與 journald 分開運作。因此這兩種日誌的讀取方式與容量管理方式都不同。
| 項目 | journald(journalctl) | rsyslog |
|---|---|---|
| 讀取方式 | journalctl | cat, less, grep |
| 儲存位置 | /run/log/journal 或 /var/log/journal | /var/log/messages(RHEL 系列)或 /var/log/syslog(Debian 系列) |
| 容量管理 | journald.conf 的 SystemMaxUse 等 | logrotate |
7️⃣ journalctl 指令的讀取權限與選項
🔲 讀取權限
用 root 以外的帳號執行 journalctl 時,最上方會出現 [Hint] 文字,而且只看得到該帳號留下的日誌。在 Debian 12 伺服器上用一般帳號找 nginx 日誌時,提示訊息後面只出現 [-- 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 --依 id -nG 的結果,這個帳號只屬於一個群組,不在提示訊息提到的 adm 或 systemd-journal 群組中。
id -nGuser官方手冊說明,systemd-journal、adm、wheel 群組的帳號可以讀取所有日誌。adm 與 wheel 還附帶發行版規定的其他權限,wheel 往往連管理工作都能做,所以只讀日誌的帳號適合用 systemd-journal 群組。
usermod -aG systemd-journal user新增群組的 usermod 指令本文沒有執行。新增群組後,請重新登入並用 id -nG 確認群組。具有管理員權限的帳號用 sudo journalctl 執行也能看到所有日誌。
[Hint] 文字可用 -q 隱藏。不過即使加上 -q,看得到的日誌仍只有該帳號留下的行。--user 讀取該帳號的使用者日誌,只在把日誌存到磁碟的伺服器上有效。在把日誌放在磁碟上的 Debian 12 伺服器上,出現了該帳號的 systemd 行與 logger 行。
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🔲 journalctl 指令選項
📌 主要選項:本文實際執行的結果
| 選項 | 作用 | 本文看到的結果 | |
|---|---|---|---|
| -n 行數 | 只輸出最後幾行,省略數字時為 10 行 | -n 3 顯示最後三行 | |
| -r | 反轉順序,把最新的行放到最上面 | crond 日誌中最後寫入的 CMDEND 行在最上面 | |
| -f | 在最後一行之後持續輸出新進來的行 | 用 logger 寫入的兩行立刻接在下方 | |
| -q | 隱藏 [Hint] 之類的提示訊息 | Debian 12 一般帳號的 --disk-usage 結果只剩一行 6.6M | |
| -u 單元 | 只輸出該服務的日誌 | 寫兩次 -u 時,四行 crond 之後依時間順序接著兩行 nginx reload | |
| -t 標籤 | 只輸出 logger -t 所留標籤的日誌 | -t myapp 顯示 logger 寫入的行 | |
| -g 文字 | 只輸出訊息中含有該文字的行 | crond 最後兩行之中只剩下含有 anacron 的一行 | |
| --since, --until | 要輸出的時間範圍的起點與終點 | --since '-2h' 從 06:01 寫入的 crond 行開始 | |
| -b | 只看目前開機之後的日誌,-b -1 是先前的開機 | 在沒有把日誌放在磁碟上的 AlmaLinux 伺服器上,-b -1 只出現 [no persistent journal was found] 提示 | |
| --list-boots | 日誌中留下的開機清單 | AlmaLinux 伺服器只有一筆開機紀錄 | |
| -p 等級 | 只輸出該優先等級與更重要的等級 | -p err 時 notice 行被排除只剩 err 行,warning..err 也是同一行 | |
| -k | 只輸出目前開機的核心訊息 | 最後三行全都是 systemd-rc-local-generator 的行 | |
| -o 格式 | 改變每一行的輸出格式 | short-iso 在時間結尾加上 +0000,cat 只留下訊息 | |
| --output-fields 欄位 | 在 json 輸出中挑選欄位 | 只挑四個欄位時 __CURSOR、_BOOT_ID 與兩個時間欄位也會一起出現 | |
| --disk-usage | 輸出日誌檔案整體所占的大小 | Debian 12 伺服器的一般帳號為 6.6M | |
| --user | 讀取該帳號的使用者日誌 | 在 Debian 12 伺服器上出現該帳號的 systemd 行與 logger 行 | |
| --utc | 以 UTC 輸出時間 | 即使在另外設定時區的 AlmaLinux 伺服器上,crond 日誌的時間也改為 UTC | |
| 欄位=值 | 只輸出具有該欄位值的行 | _PID=347704 只顯示 logger 留下的一行 err |
📎 其他選項:依官方手冊
| 選項 | 作用 | |
|---|---|---|
| --no-pager | 不經 less 直接輸出到終端機 | |
| -e, --pager-end | 在日誌結尾開啟 less 畫面,不寫 -n 時為 1000 行 | |
| -x, --catalog | 在日誌行後附上訊息目錄中的說明文字 | |
| -a, --all | 即使有無法輸出的字元或很長的欄位也不省略地輸出 | |
| -N, --fields | 輸出日誌中使用的所有欄位名稱 | |
| -F, --field= 欄位 | 輸出該欄位擁有的所有值 | |
| -D 資料夾 | 讀取指定資料夾的日誌,而不是預設的日誌位置 | |
| --file= 檔案 | 讀取指定的日誌檔案,可寫多次 | |
| --vacuum-size= 大小 | 從最舊的開始刪除已封存的日誌檔案,降到指定大小以下 | |
| --vacuum-time= 期間 | 刪除只含有比指定期間更舊的行的封存檔案 | |
| --vacuum-files= 個數 | 刪除已封存的日誌檔案,只保留指定個數 | |
| --rotate | 把目前使用中的日誌檔案轉為封存檔案並開始新檔案 | |
| --flush | 把記憶體(/run/log/journal)中的日誌移到磁碟(/var/log/journal),persistent 儲存時 |
🔲 journalctl 指令模擬器
在下方的模擬器中,可以直接輸入指令確認最近的日誌、各服務日誌、時間範圍、優先等級與輸出格式。
🔢 FAQ & 推薦內容




ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。



