Linux

Logrotate 成功,原始文件恢復到原始大小

  • April 10, 2016

在導致日誌文件旋轉然後恢復到原來的大小之前,是否有人對 logrotate 有任何問題?這是我的發現:

日誌旋轉腳本:

/var/log/mylogfile.log {
旋轉 7
日常
壓縮
舊目錄 /log_archives
失踪的
通知空
複製截斷
}

Logrotate 的詳細輸出:

將 /var/log/mylogfile.log 複製到 /log_archives/mylogfile.log.1
截斷 /var/log/mylogfile.log
使用以下壓縮日誌:/bin/gzip
刪除舊日誌 /log_archives/mylogfile.log.8.gz

截斷發生後的日誌文件

[root@server ~]# ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 part1 part1 0 Jan 11 17:32 /var/log/mylogfile.log

從字面上看幾秒鐘後:

[root@server ~]# ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 part1 part1 3.5G Jan 11 17:32 /var/log/mylogfile.log

RHEL 版本:

[root@server ~]# cat /etc/redhat-release
紅帽企業 Linux ES 第 4 版(Nahant 更新 4)

日誌旋轉版本:

[root@DAA21529WWW370 ~]# rpm -qa | grep 日誌旋轉
logrotate-3.7.1-10.RHEL4

幾點注意事項:

  • 服務無法即時重新啟動,這就是我使用 copytruncate 的原因
  • 根據每晚包含olddir日誌文件的目錄,日誌每晚都在輪換。

這可能是因為即使您截斷了文件,寫入文件的程序仍將繼續寫入它最後的偏移量。所以發生的事情是 logrotate 截斷文件,大小為零,程序再次寫入文件,繼續在它離開的偏移量處,你現在有一個 NULL 字節的文件,直到你截斷它加上新的寫入日誌的條目。

od -c 截斷+突然增長後,產生的輸出如下:

0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
33255657600  \0   C   K   B   -   s   e   r   v   e   r       [   h   t   t
33255657620 <more log output>

這說的是從偏移量 0 到 33255657600 你的文件由空字節組成,然後是一些清晰的數據。達到這種狀態所花費的時間與實際寫入所有這些空字節所花費的時間不同。ext{2,3,4} 文件系統支持稱為稀疏文件的東西,因此如果您搜尋文件中不包含任何內容的區域,則該區域將被假定為包含空字節並且不會佔用空間在磁碟上。這些空字節實際上不會被寫入,只是假設在那裡,因此從 0 到 3.5GB 所需的時間並不需要很多時間。(您可以通過執行類似的操作來測試它所花費的時間dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1,這應該會在幾毫秒內生成一個超過 3GB 的文件)。

如果您ls -ls在日誌文件被截斷並再次突然增長後執行日誌文件,它現在應該在行的開頭報告一個代表實際大小(以磁碟上佔用的塊為單位)的數字,這可能是數量級小於剛剛報告的大小ls -l

引用自:https://serverfault.com/questions/221337