Apache-2.2

如何自動清理帶日期戳的日誌

  • May 21, 2013

我有一個帶有各種虛擬主機的 apache Web 伺服器。每個虛擬主機都使用 cronolog 記錄到帶有日期標記的文件。結果是我最終得到了很多這樣的文件:

----rw-r-- 1 root     root      467894 2013-02-01 13:43 2013-02-01-tracg.dev.local-access.log
----rw-r-- 1 root     root         222 2013-02-01 01:09 2013-02-01-tracg.dev.local-error.log
----rw-r-- 1 root     root         222 2013-02-02 01:10 2013-02-02-tracg.dev.local-error.log
----rw-r-- 1 root     root         333 2013-02-03 06:47 2013-02-03-tracg.dev.local-error.log
-rw-r--r-- 1 root     root       39574 2013-02-04 14:20 2013-02-04-tracg.dev.local-access.log
----rw-r-- 1 root     root         444 2013-02-04 08:24 2013-02-04-tracg.dev.local-error.log
----rw-r-- 1 root     root         444 2013-02-05 12:14 2013-02-05-tracg.dev.local-error.log
----rw-r-- 1 root     root       98135 2013-02-06 13:30 2013-02-06-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-06 09:13 2013-02-06-tracg.dev.local-error.log
-rw-r--r-- 1 root     root        8872 2013-02-07 13:55 2013-02-07-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-07 02:00 2013-02-07-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         666 2013-02-08 14:31 2013-02-08-tracg.dev.local-error.log
----rw-r-- 1 root     root         192 2013-02-09 01:08 2013-02-09-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         530 2013-02-09 01:08 2013-02-09-tracg.dev.local-error.log
----rw-r-- 1 root     root         192 2013-02-10 01:08 2013-02-10-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         641 2013-02-10 06:32 2013-02-10-tracg.dev.local-error.log
----rw-r-- 1 root     root       64565 2013-02-11 13:56 2013-02-11-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         752 2013-02-11 06:28 2013-02-11-tracg.dev.local-error.log
----rw-r-- 1 root     root       54988 2013-02-12 11:56 2013-02-12-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         752 2013-02-12 08:45 2013-02-12-tracg.dev.local-error.log
-rw-r--r-- 1 root     root       15003 2013-02-13 11:19 2013-02-13-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-13 10:48 2013-02-13-tracg.dev.local-error.log
----rw-r-- 1 root     root       32819 2013-02-14 15:43 2013-02-14-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-14 14:29 2013-02-14-tracg.dev.local-error.log
----rw-r-- 1 root     root      135665 2013-02-15 13:53 2013-02-15-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-15 11:39 2013-02-15-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         444 2013-02-16 01:10 2013-02-16-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         555 2013-02-17 06:33 2013-02-17-tracg.dev.local-error.log
-rw-r--r-- 1 root     root       30763 2013-02-18 14:15 2013-02-18-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-18 09:00 2013-02-18-tracg.dev.local-error.log
----rw-r-- 1 root     root       15058 2013-02-19 09:37 2013-02-19-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-19 09:16 2013-02-19-tracg.dev.local-error.log
----rw-r-- 1 root     root      132587 2013-02-20 15:55 2013-02-20-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         444 2013-02-20 01:11 2013-02-20-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         666 2013-02-21 09:07 2013-02-21-tracg.dev.local-error.log
-rw-r--r-- 1 root     root      226997 2013-02-22 15:36 2013-02-22-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-22 08:26 2013-02-22-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         444 2013-02-23 01:12 2013-02-23-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         555 2013-02-24 06:48 2013-02-24-tracg.dev.local-error.log
----rw-r-- 1 root     root      130913 2013-02-25 11:36 2013-02-25-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-25 11:37 2013-02-25-tracg.dev.local-error.log
----rw-r-- 1 root     root       21542 2013-02-26 14:43 2013-02-26-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-26 15:39 2013-02-26-tracg.dev.local-error.log
----rw-r-- 1 root     root       99698 2013-02-27 13:28 2013-02-27-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         444 2013-02-27 01:13 2013-02-27-tracg.dev.local-error.log
----rw-r-- 1 root     root      111632 2013-02-28 13:57 2013-02-28-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-28 11:55 2013-02-28-tracg.dev.local-error.log
----rw-r-- 1 root     root      205731 2013-03-01 13:30 2013-03-01-tracg.dev.local-access.log
-rw-r--r-- 1 root     root        1332 2013-03-01 14:31 2013-03-01-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         444 2013-03-02 01:11 2013-03-02-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         555 2013-03-03 06:35 2013-03-03-tracg.dev.local-error.log
----rw-r-- 1 root     root      211616 2013-03-04 10:42 2013-03-04-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-03-04 10:42 2013-03-04-tracg.dev.local-error.log

這一切都很好,但是,我希望有一個 cron 作業自動 gzip 所有目前未使用的日誌文件。我不能只做:gzip -9 /data/www/virtual/ /log/ .log

這也將 gzip 目前打開的日誌文件。那麼如何做到這一點,以便我只壓縮目前未使用的那些?

一種方法是:

find /data/www/virtual/log/ -name '*.log' -mtime +2 -exec gzip {} +

.log這會壓縮任何以至少兩天未修改的文件結尾的文件。

另一種方法是:

gzip $(date --date="yesterday" "+/data/www/virtual/log/%Y-%m-*.log")

這將計算昨天的日期並壓縮以該日期開頭並以.log.

請記住,$()並且%不會在 cron 作業中工作,因為$()它是 bash 的事情,並且%在 crontabs 中具有特殊含義。把這個放在一個腳本中,然後從 cron 作業中呼叫這個腳本。實際上,對所有這些方法都這樣做。

還有一種方式:

for FILE in /data/www/virtual/log/*.log
do
 if [ `fuser -s $FILE` ]
 then
   gzip $FILE
 fi
done

這會壓縮任何以任何程序結尾.log且目前未打開的文件。

logrotate您仍在使用cronolog. 我從來沒有使用logrotate過每天都有不同名稱的日誌文件,但您可以*.log在配置文件中指定,這樣就可以了。

或者,您可以放棄cronolog,一直登錄到同一個文件並logrotate每天移動它們。這也將處理刪除最舊的,因此您使用的磁碟空間量相對穩定。

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