journalctl 指令:用法、各服務日誌與日誌容量整理

測試環境RHEL 系列AlmaLinux 9.8systemd 252root 帳號Debian 12 一般帳號2026-11-05 確認
系統資訊 · 設定指令journalctl位置/usr/bin/journalctl

journalctl 指令是從 systemd 日誌中挑出並閱讀服務與核心所留下日誌的工具。在使用 systemd 的 Linux 上,systemd-journald 會把這些日誌集中到日誌裡。在 AlmaLinux 9 伺服器與 Debian 12 伺服器上依服務、時間與優先等級挑選日誌來讀後發現,一般帳號只看得到自己的日誌,而把日誌放在記憶體中的伺服器無法選擇先前的開機。

以下輸出來自兩台伺服器。主機名稱、帳號、開機 ID、AlmaLinux 伺服器的程序編號與 systemd 套件的發行版本都換成了範例值,兩台伺服器的時間都以 UTC 輸出。

1️⃣ journalctl 指令用法與最近的日誌

不加選項執行 journalctl 時,日誌會從最舊的一行開始在 less 畫面中開啟,所以要看最近的日誌時,請用 -n 指定行數。-n 後面省略數字時會顯示 10 行。

journalctl -n 3
Oct 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 3
Oct 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 myapp
Oct 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 4
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)
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 myapp
Oct 28 07:12:44 server2 myapp[347693]: journalctl test message

-g 只留下訊息中含有特定文字的行。要找的文字全部用小寫寫的話,就不區分大小寫。

journalctl -u crond -g anacron -n 2
Oct 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 -4
Oct 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 2
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)

--list-boots 會針對日誌中留下的每次開機,輸出編號、開機 ID 以及第一行與最後一行的時間。

journalctl --list-boots
IDX BOOT ID                          FIRST ENTRY                 LAST ENTRY
  0 4f1c2a9be0d34c7a8e6b5d20c1f3a7e9 Sat 2026-10-17 08:29:26 UTC Wed 2026-10-28 07:16:10 UTC

AlmaLinux 伺服器沒有把日誌放在磁碟上,所以只有一筆開機紀錄。因此指定先前開機的 -b -1 只留下提示訊息就結束了。

journalctl -b -1
Specifying boot ID or boot offset has no effect, no persistent journal was found.

先前開機的日誌,只有在把日誌存到磁碟(/var/log/journal)的伺服器上才能用 -b -1 讀取。

4️⃣ journalctl 錯誤日誌與核心日誌

-p 依日誌的優先等級挑選行。寫一個等級時,會顯示該等級以及比它更重要的所有等級,等級用名稱或數字寫都可以。

等級純數值說明
emerg0系統無法使用的狀態
alert1需要立即處理的狀態
crit2嚴重錯誤
err3錯誤
warning4警告
notice5正常但值得留意,不加 -p 時 logger 留下的行的等級
info6網站資訊
debug7除錯訊息

用 logger 留下一行 err 等級後再用 -p err 挑選,同一標籤的 notice 等級行(journalctl test message)就被排除,只剩下 err 行。

logger -t myapp -p user.err 'journalctl error test'; journalctl -q -t myapp -p err
Oct 28 07:12:46 server2 myapp[347704]: journalctl error test

用兩個點連接兩個等級時,只會輸出該範圍。挑選 warning..err 時只留下警告與錯誤等級。

journalctl -q -t myapp -p warning..err
Oct 28 07:12:46 server2 myapp[347704]: journalctl error test

-k 只留下核心訊息,並且只輸出目前開機之後的行。

journalctl -k -n 3
Oct 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-iso
2026-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)。

🖥️ 留下日誌的一方服務、核心、logger
systemd-journald把收到的日誌存成日誌檔案
/run/log/journalStorage=auto(沒有資料夾)、記憶體、重新開機就清空
/var/log/journalStorage=persistent 或 auto(有資料夾)、磁碟、重新開機後仍保留
🖥️ journalctl讀取並輸出兩個資料夾的日誌檔案

AlmaLinux 伺服器沒有 /var/log/journal 資料夾,日誌只在 /run/log/journal 中。

ls -ld /var/log/journal /run/log/journal
ls: cannot access '/var/log/journal': No such file or directory
drwxr-sr-x+ 4 root systemd-journal 80 Oct 17 08:30 /run/log/journal

Debian 12 伺服器兩個資料夾都有,日誌一直累積在磁碟上。

ls -ld /var/log/journal /run/log/journal
drwxr-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-usage
Archived 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
讀取方式journalctlcat, 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 5
Hint: 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 -nG
user

官方手冊說明,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 3
Oct 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 指令模擬器

在下方的模擬器中,可以直接輸入指令確認最近的日誌、各服務日誌、時間範圍、優先等級與輸出格式。

journalctl 指令模擬器systemd 252
[root@server work]#
只在瀏覽器中運作,用 logger 寫入的行在重新整理後會消失,用 ↑↓ 可以叫出先前輸入的指令。

🔢 FAQ & 推薦內容

加上 --utc 後,無論伺服器的時區設定為何,都會以 UTC 輸出時間。即使在另外設定時區的 AlmaLinux 伺服器上,加上 --utc 的 crond 日誌時間也改成以 UTC 為準。

像 journalctl _PID=347704 這樣用等號連接欄位名稱與值,就只會留下該值的行。用 logger 留下的 err 行的程序編號來找時,只出現那一行;與 -u 一起寫時,只輸出同時符合兩個條件的行。

🧭 系統資訊 · 設定指令 推薦內容 文章 8 · 參考 2
🗂️ 系統資訊 · 設定指令
📄 CPU · RAM · 磁碟 · OS 資訊 📄 uname · 核心版本 📄 free 指令 📄 uptime 指令
📄 timedatectl 指令 📄 localectl 指令
📄 logrotate 📄 journalctl 指令

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 6   +   9   =