logrotate機制和原理

2021-07-25 21:56:22 字數 2742 閱讀 1924

**:

日誌實在是太有用了,它記錄了程式執行時各種資訊。通過日誌可以分析使用者行為,記錄執行軌跡,查詢程式問題。可惜磁碟的空間是有限的,就像飛機裡的黑匣子,記錄的資訊再重要也只能記錄最後一段時間發生的事。為了節省空間和整理方便,日誌檔案經常需要按時間或大小等維度分成多份,刪除時間久遠的日誌檔案。這就是通常說的日誌滾動(log rotation)。

logrotate在很多linux發行版上都是預設安裝的。系統會定時執行logrotate,一般是每天一次。系統是這麼實現按天執行的。crontab會每天定時執行/etc/cron.daily目錄下的指令碼,而這個目錄下有個檔案叫logrotate。在centos上指令碼內容是這樣的:

# vi /etc/cron.daily/logrotate

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1

exitvalue=$?

if [ $exitvalue != 0 ]; then

/usr/bin/logger -t logrotate "alert exited abnormally with [$exitvalue]"

fiexit 0

可以看到這個指令碼主要做的事就是以/etc/logrotate.conf為配置檔案執行了logrotate。就是這樣實現了每天執行一次logrotate。

因為我的系統執行/etc/cron.daily目錄下的指令碼不是我想滾動日誌的時間,所以我把/etc/cron.daily/logrotate拷了出來,改了一下logrotate配置檔案的路徑,然後在crontab裡加上一條指定時間執行這個指令碼的記錄,自定義週期滾動日誌就大功告成了。這種自定義的方式有兩點要注意:

配置檔案裡一定要配置rotate 檔案數目這個引數。如果不配置預設是0個,也就是只允許存在乙份日誌,剛切分出來的日誌會馬上被刪除。多麼痛的領悟,說多了都是淚。

執行logrotate命令最好加-f引數,不然有時候配置檔案修改的內容不生效。

很多程式的會用到logrotate滾動日誌,比如nginx。它們安裝後,會在/etc/logrotate.d這個目錄下增加自己的logrotate的配置檔案。logrotate什麼時候執行/etc/logrotate.d下的配置呢?看到/etc/logrotate.conf裡這行,一切就不言而喻了。

include /etc/logrotate.d
logrotate是怎麼做到滾動日誌時不影響程式正常的日誌輸出呢?logrotate提供了兩種解決方案。

介紹一下相關的linux下的檔案操作機制。

linux檔案系統裡檔案和檔名的關係如下圖。

目錄也是檔案,檔案裡存著檔名和對應的inode編號。通過這個inode編號可以查到檔案的元資料和檔案內容。檔案的元資料有引用計數、操作許可權、擁有者id、建立時間、最後修改時間等等。檔案件名並不在元資料裡而是在目錄檔案中。因此檔案改名、移動,都不會修改檔案,而是修改目錄檔案。

借《unix環境高階程式設計》裡的圖說一下程序開啟檔案的機制。

預設方案沒有名字,姑且叫它create吧。因為這個方案會建立乙個新的日誌檔案給程式輸出日誌,而且第二個方案名copytruncate是個配置項,與create配置項是互斥的。

這個方案的思路是重新命名原日誌檔案,建立新的日誌檔案。詳細步驟如下:

重新命名程式當前正在輸出日誌的程式。因為重新命名只會修改目錄檔案的內容,而程序操作檔案靠的是inode編號,所以並不影響程式繼續輸出日誌。

建立新的日誌檔案,檔名和原來日誌檔案一樣。雖然新的日誌檔案和原來日誌檔案的名字一樣,但是inode編號不一樣,所以程式輸出的日誌還是往原日誌檔案輸出。

通過某些方式通知程式,重新開啟日誌檔案。程式重新開啟日誌檔案,靠的是檔案路徑而不是inode編號,所以開啟的是新的日誌檔案。

有個地方值得一提,乙個程式可能輸出了多個需要滾動的日誌檔案。每滾動乙個就通知程式重新開啟所有日誌檔案不太划得來。有個sharedscripts的引數,讓程式把所有日誌都重新命名了以後,只通知一次。

如果程式不支援重新開啟日誌的功能,又不能粗暴地重啟程式,怎麼滾動日誌呢?copytruncate的方案出場了。

這個方案的思路是把正在輸出的日誌拷(copy)乙份出來,再清空(trucate)原來的日誌。詳細步驟如下:

拷貝程式當前正在輸出的日誌檔案,儲存檔名為滾動結果檔名。這期間程式照常輸出日誌到原來的檔案中,原來的檔名也沒有變。

清空程式正在輸出的日誌檔案。清空後程式輸出的日誌還是輸出到這個日誌檔案中,因為清空檔案只是把檔案的內容刪除了,檔案的inode編號並沒有發生變化,變化的是元資訊中檔案內容的資訊。

結果上看,舊的日誌內容存在滾動的檔案裡,新的日誌輸出到空的檔案裡。實現了日誌的滾動。

這個方案有兩個有趣的地方。

日誌在拷貝完到清空檔案這段時間內,程式輸出的日誌沒有備份就清空了,這些日誌不是丟了嗎?是的,copytruncate有丟失部分日誌內容的風險。所以能用create的方案就別用copytruncate。所以很多程式提供了通知我更新開啟日誌檔案的功能來支援create方案,或者自己做了日誌滾動,不依賴logrotate。

logrotate是個優秀的日誌滾動工具,它是用蜂蜜,川貝,桔梗,加上天山雪蓮配製而成,不須冷藏,也沒有防腐劑,除了毒性猛烈之外,味道還很好吃。實在是居家旅行、殺人滅口必備良藥!

logrotate 日誌切割 原理

logrotate 是怎麼做到滾動日誌時不影響程式正常的日誌輸出呢?logrotate 提供了兩種解決方案。create copytruncate 介紹一下相關的 linux 下的檔案操作機制。linux 檔案系統裡檔案和檔名的關係如下圖。目錄也是檔案,檔案裡存著檔名和對應的 inode 編號。通過...

遊戲原理和機制

重點 渲染驅動遊戲 事件驅動遊戲 渲染驅動遊戲 根據時間來繪製不同的效果,需要實時繪製。drawmenu drawgame drawover draw 不斷的執行 渲染迴圈 event 不斷的執行 事件迴圈 幀率 fps,frame per second 在30幀以上可以接受流暢執行,60幀以上就沒...

dubbo原理和機制

dubbo 框架是用來處理分布式系統中,服務發現與註冊以及呼叫問題的,並且管理呼叫過程。一,工作流程 二 各個部分整體機制 1 提供者暴露服務的整體機制 2.註冊中心 其主要作用如下 dubbo 有四種註冊中心的實現,分別是 zookeeper,redis,和 multicast。zookeeper...