清理 systemd 的 journal 檔案

使用 systemd 的 Linux 作業系統通常會在目錄 /var/log/journal/ 下存放 systemd-journald 這個服務所蒐集到的系統的 log 檔案,時間久了如果沒清理就可能會佔用一定大小的磁碟空間,對日常使用不會有什麼明顯影響,但是當磁碟空間不夠用、或是想要封裝、轉移系統的時候,清理這個目錄就會很有幫助 (可以少處理一些檔案),當然有這種情況時 /var/log 底下的其他 log 檔案可能也要清理,不過瞥除跑對外服務可能產生的大量 log 外,systemd 的 journal 也許會相對佔用比較多空間,可以考慮優先處理。

對於刪除不認識的檔案難免會擔心是否造成不良的影響,一般來說清除 systemd 的 journal 檔案並不會對系統造成危害,可以放心操作,但要不要清理這種事就見仁見智,保留太久的日誌有時候不見得有什麼價值 (當然還是看主機性質而定),有些人可能永遠用不到這些 log 、有些人可能經常會需要靠 log 來 debug 問題,清理後系統的 log 變少了省下空間,但如果剛好在追問題的話可能就暫時先避免類似的操作,或是清理時還是要保留一些 log 下來,以免相關資訊被清掉了增加追查問題的難度

Systemd-journald 預設使用的空間是磁碟大小的一成空間、上限是 4GB,要了解目前的上限以及使用狀況可以透過 journalctl -u systemd-journald 來得知:

$ sudo journalctl -u systemd-journald | tail -n 5
-- Reboot --
Jan 04 16:48:07 x systemd-journald[489]: Journal started
Jan 04 16:48:07 x systemd-journald[489]: Runtime journal (/run/log/journal/ef635a010d284bc38d762d2b9f0e65ac) is 8.0M, max 158.0M, 150.0M free.
Jan 04 16:48:07 x systemd-journald[489]: Time spent on flushing to /var is 177.349ms for 1008 entries.
Jan 04 16:48:07 x systemd-journald[489]: System journal (/var/log/journal/ef635a010d284bc38d762d2b9f0e65ac) is 4.0G, max 4.0G, 0B free.

也可以透過 dujournal --disk-usage 指令看目前使用的空間,像我這台主機就被佔用了 4GB :

$ du -d 0 -h /var/log/journal/
4.1G	/var/log/journal/

$ sudo journalctl --disk-usage
Archived and active journals take up 4.0G in the file system.

如果這時候找不到 /var/log/journal/ ,那有可能是因為這個目錄曾經被刪除過 (刪除後不一定會自動重建、要看設定)、或是 systemd 的設定是不會把 log 直接保存在磁碟上,這時後 log 可能就只有放在 /run/log/journal/ ,那就不是佔用磁碟空間、而是使用記憶體空間,清理的時機或動機就不太一樣。

最簡單的清理方式就是直接砍檔案,要小心的是除非之後不打算讓 journal 繼續往磁碟上寫,否則別把整個 /var/log/journal/ 資料夾都砍了,砍底下的內容就好

使用 rm 指令清理 /var/log/journal/ 目錄

這邊搭配 -rf 參數

$ sudo rm -rf /var/log/journal/*

砍完之後記得重啟 systemd-journald 服務:

$ sudo systemctl restart systemd-journald.service

上面的方法一次把 /var/log/journal/ 清理乾淨、可以釋出最多的可用空間,相對的如果在清理的前後有遇到一些問題想要翻 log 來看就會比較麻煩,如果有這樣的疑慮就建議考慮接下來使用 journalctl --vacuum 系列指令進行清理的方法

使用 journalctl --vacuum 系列指令進行在清理時還是會保留部份 log 下來供後續使用,不過這樣的方法只會處理已經被封存(archived) 的日誌檔,仍然在使用中(active)的日誌檔案則不會被清除,能清出的空間會比較有限,且在執行時如果遇到日誌損壞的問題可能就沒辦法正常操作,手動刪除日誌檔案則不會受到日誌損壞影響而無法進行。

1. 清除存在超過特定時間的 journal

超過這個時間範圍的 journal 就會被刪掉,支援的單位有秒(s, sec)、分(m, min)、時(h, hour(s))、天(d, day(s))、週(w, week(s))、月(month(s))、年(y, year(s)) 等,例如 30 以天為例:

$ sudo journalctl --vacuum-time=30d
Deleted archived journal /run/log/journal/00e8b7a35d2370b03e81d8735b57803d/[email protected]e29e0f9a6.journal (80.0M).
Vacuuming done, freed 80.0M of archived journals on disk.

2. 清除超過指定數量的 journal 檔案

例如只保留 20 個 journal 檔案,超過的就會被刪掉:

$ sudo journalctl --vacuum-files=20
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/[email protected]9aab44cf705b.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/[email protected]9aabb49e8b05.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/[email protected]9aaaf3ab4e11.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/[email protected]9aa70225c694.journal (8.0M).

.
.
.

Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/[email protected]9b328b0929c6.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/[email protected]9b371c89d60d.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/[email protected]9b33bee8d3fb.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/[email protected]9b3cf5af895f.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/[email protected]9b3790666b0f.journal (8.0M).
Deleted archived journal /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510/[email protected]9b38a52f3aa5.journal (8.0M).
Vacuuming done, freed 848.0M of archived journals from /var/log/journal/e09ef3f4f2e248bfb744cca85b9e1510.

3. 清除舊的 journal 檔案直到使用的空間低於指定的大小

使用的單位為 “K”, “M”, “G” 和 “T”,例如指定為 3G (GB) ,journalctl 就會開始清除舊的日誌,直到使用的空間被清理到到小於 3GB 為止,假設原本已經使用了 4GB ,操作後就會清出 1GB 左右的空間

下面執行結果中間類似的訊息因為長度關係就拿掉了用點點點代替,但是可以留意一下最後一行有顯示清出了多少空間的訊息:

$ sudo journalctl --vacuum-size=3G
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]804308d8cba8.journal (120.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]f09b893da.journal (40.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]819f09b831cb.journal (128.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]c637966b2.journal (96.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]~ (56.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]8267988647c9.journal (120.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]4068ce84d.journal (96.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]~ (24.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]~ (72.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]df5c9a4e35-016146744911be45.journal~ (48.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]~ (16.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]~ (56.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]~ (80.0M).
Deleted archived journal /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac/[email protected]~ (56.0M).
Vacuuming done, freed 1008.0M of archived journals from /var/log/journal/ef635a010d284bc38d762d2b9f0e65ac.

以上三個參數也可以同時帶入 journalctl 一次使用,在清出空間後就可以比較有效率的進行系統轉移或是打包了

實際執行時的畫面截圖:

在某一台主機上執行 sudo journalctl --vacuum-size=10M 進行磁碟空間清理的截圖

如果想要更直接的調整使用空間或檔案數量上限,讓 journal 沒有機會長到這麼大 (預設的 4GB 或磁碟大小的 10%) ,固定節省一些磁碟空間,可以在 /etc/systemd/journald.conf 補上對應的 SystemMaxUse=, SystemMaxFiles= 等限制,例如 SystemMaxUse=100M, SystemMaxFiles=20 ,設定完後一樣記得重啟 systemd-journald ,這樣就不用擔心 journal 會佔用太多的空間了,這部份細節可參考 man journald.conf 的說明。

發表迴響