1492 字
7 分鐘
🐧 Linux下的日誌,如何優雅地管理
Cover image for 🐧 Linux下的日誌,如何優雅地管理

#前言

有的時候我們需要在Linux上執行命令,然後把日誌寫到一個文件中,就像下面這條命令一樣。

nohup vllm serve glm-4v-9b --port 8081 >> mylog.log

在Java應用中,可以使用logback或log4j這樣的框架管理日誌。但通過命令寫入的日誌要如何優雅地管理起來呢?

#Logrotate介紹

logrotate 是一個在Linux系統中廣泛使用的日誌文件管理工具,用於自動管理日誌文件的大小和歸檔。Logrotate默認安裝在發行版本的Linux服務器上,對於用戶來說直接配置使用即可。

#Github開源地址如下

logrotate
/
logrotate
Waiting for api.github.com...
00K
0K
0K
Waiting...

#Logrotate的配置

Logrotate默認有三個重要的路徑:

  • 執行腳本路徑:/usr/sbin/logrotate
  • 主配置文件:/etc/logrotate.conf
  • 自定義配置文件:/etc/logrotate.d/*

如果有新的需要管理日誌的任務的時候,只需要在/etc/logrotate.d/目錄下創建新的配置文件即可。配置完成後不需要重啟。

#第一個案例

還是開頭的這個例子,如果我希望實現mylog.log文件大於50M就進行切割,最多保留10個文件,就可以這樣配置:

sudo vi /etc/logrotate.d/myapp
/var/log/myapp.log {
size 50M
rotate 10
missingok
notifempty
compress
delaycompress
copytruncate
create 0644 root root
}

#每個參數的注釋放在這里:

size 50M # 當日誌文件大小超過 50 MB 時分割
rotate 10 # 最多保留 10 個文件
missingok # 如果日誌文件不存在則忽略錯誤
notifempty # 如果日誌為空則不進行分割
compress # 壓縮舊日誌文件
delaycompress # 延遲壓縮,避免對最新的日誌文件立即壓縮
copytruncate # 覆制並截斷原日誌文件,以免應用程序需要重啟
create 0644 root root # 創建新的日誌文件,設置權限

第一行是日誌的具體路徑,配置里是各種參數,每個參數表達的意思已經放在後面的注釋里了。 配置完成之後,調用下面這行命令就可以進行測試,-d參數可以測試腳本是否正常。

sudo logrotate -d /etc/logrotate.d/myapp

如果存在報錯,根據具體的報錯解決問題即可

#第二個案例

實現每天生成一個新的日誌文件,並保留最多 7 天的數據,還是一樣的配置思路,創建一個配置文件

sudo vi /etc/logrotate.d/myapp2
/var/log/myapp2.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
create 0644 root root
}

每個參數的注釋放在這里:

daily # 按天分割日誌
rotate 7 # 最多保留 7 天的日誌
missingok # 如果日誌文件不存在則忽略錯誤
notifempty # 如果日誌為空則不進行分割
compress # 壓縮舊日誌文件,生成 .gz 文件
delaycompress # 延遲壓縮,保留最近一個分割的文件為原始格式
copytruncate # 截斷原日誌文件,而不是創建新文件
create 0644 root root # 每次分割後創建新日誌文件並設置權限

和第一個案例的區別在於,使用daily來分割日誌,而不是使用大小來分割日誌。

#Logrotate參數介紹

#運行參數

在調試配置的時候,我們使用了logrotate -d這個參數,用於debug,除此之外,還有一些運行參數可以使用

- -f 或 --force:強制輪轉日誌文件,不論日誌輪轉條件是否達到。例如,即使日誌文件沒有達到設定大小或時間條件,也會進行輪轉。
- -v 或 --verbose:啟用詳細輸出模式,顯示 logrotate 執行過程中處理的詳細信息。
- -d 或 --debug:啟用調試模式,不會實際輪轉日誌,只會顯示 logrotate 將要執行的操作。
- -s <state_file> 或 --state <state_file>:指定 logrotate 的狀態文件,記錄最後一次輪轉的時間。默認文件路徑為 /var/lib/logrotate/status。
- -m <mail_command> 或 --mail <mail_command>:指定發送錯誤報告的郵件命令。
- -l <log_file> 或 --log <log_file>:指定記錄 logrotate 日誌信息的日誌文件。
- -t 或 --test:用於測試配置文件的語法和邏輯,通常和 -d 一起使用以檢查配置文件的正確性。

比如想要測試一下會生成怎樣的日誌,就可以使用-f參數,強制輪轉日誌文件。

#配置文件參數

前面已經介紹了很多常用的配置文件參數,還有一些更多的參數可以配置時使用

#基本參數

- daily:按天輪轉日誌。
- weekly:按周輪轉日誌。
- monthly:按月輪轉日誌。
- yearly:按年輪轉日誌。

#條件和限制

- size <size>:當日誌文件達到指定大小時進行輪轉。可以指定 k、M、G 表示 KB、MB、GB,比如 size 50M。
- rotate <count>:保留的日誌文件數量。例如,rotate 5 表示最多保留 5 個輪轉文件,超過的舊日誌文件將被刪除。
- missingok:如果日誌文件不存在,則忽略錯誤,不會影響其他文件的輪轉。
- notifempty:如果日誌文件為空,則不進行輪轉。

#文件管理

- compress:對輪轉後的日誌文件進行壓縮,通常會生成 .gz 文件。
- nocompress:不對輪轉後的日誌文件進行壓縮。
- delaycompress:延遲壓縮,保留最近分割的文件未壓縮,直到下次輪轉才壓縮。
- copytruncate:覆制當前日誌文件內容到新文件,並截斷原日誌文件。適合不支持重命名的程序。
- create <mode> <owner> <group>:輪轉日誌後創建新日誌文件,並設置權限。例如,create 0644 root root。

#文件命名和日期

- dateext:為日誌文件添加日期後綴(如 .log-YYYYMMDD)。
- dateformat:自定義日期格式,與 dateext 搭配使用。例如,dateformat -%Y%m%d-%s。
- extension <extension>:指定輪轉後的文件擴展名。例如,extension .log 將擴展名固定為 .log。

#總結

通過合理設置 logrotate 的配置參數,可以有效控制日誌文件的大小和數量,確保系統磁盤空間不被過度占用。

💬 參與討論
使用 GitHub 帳號登入參與討論