我有一个Apache Web服务器与各种虚拟主机。 每个虚拟主机使用cronologloggingdate标记的文件。 结果是,我得到了很多这样的文件:
----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当前打开的日志文件。 那么如何做到这一点,以便我仅仅使用那些目前没有使用的gzip?
一种方法是:
find /data/www/virtual/log/ -name '*.log' -mtime +2 -exec gzip {} +
这压缩任何以.log结尾的文件,至less两天未修改。
另一种方法是:
gzip $(date --date="yesterday" "+/data/www/virtual/log/%Y-%m-*.log")
这将计算昨天的date并压缩任何以该date开始并以.log结尾的文件。
请记住$()和%在cron作业中不起作用,因为$()是一个bash的东西, %在crontabs中有特殊的含义。 把这个放在一个脚本中,并从cron作业中调用脚本。 其实,所有这些方法都是这样做的。
另一种方式:
for FILE in /data/www/virtual/log/*.log do if [ `fuser -s $FILE` ] then gzip $FILE fi done
这将压缩以.log结尾且当前未由任何进程打开的所有文件。
有可能configurationlogrotate来处理这个问题,同时仍然使用cronolog 。 我从来没有使用日志文件,每天有不同的名称logrotate ,但你可以在configuration文件中指定*.log ,所以它可能是可能的。
或者,你可以只沟cronolog ,一直login到同一个文件,并有logrotate每天移动它们。 这也将处理删除最老的,所以你有一个相对稳定的磁盘空间使用量。
尝试:
ls -d /path/to/[0-9]*tracg.dev.local-*.log | sort -r | sed '1,2d' | xargs gzip -9
这比检查每个文件是否被打开要快,但是它假设列出的前两个(按字母顺序排列,最后两个将在最上面)是你想要跳过的。
[sed命令删除第1-2行]
用于移动旧日志文件的示例Bash脚本:
logdir='/data/www/virtual//log/' year=`date +%Y` touch -t `date +%m%d0000` /tmp/tdate for i in $(find $logdir -maxdepth 1 -type f ! -newer /tmp/tdate) do month=`ls -al $i | awk '{print $6}'` day=`ls -al $i | awk '{print $7}'` ls -al $i | awk '{print $8}' | grep ":" > /dev/null if [ $? = 0 ] then mkdir -p $logdir/previous/$day-$month-$year mv $i $logdir/previous/$day-$month-$year else year1=`ls -al $i | awk '{print $8}'` mkdir -p $logdir/previous/$day-$month-$year1 mv $i $logdir/previous/$day-$month-$year1 fi done rm -rf /tmp/tdate
在/ data / www / virtual / log /目录中创build一个以前的目录。 所有比今天更早的日志将被移到前一个目录。 在以前的目录中,它将再次创build目录,日志文件将驻留在它们所属date的目录中。
或者一个简单的解决scheme,使用Logrotate
logrotate在man文件“man logrotate”中接受通配符,INN usenet守护进程有一个通配符例子:
/var/log/news/* { monthly rotate 2 olddir /var/log/news/old missingok postrotate kill -HUP 'cat /var/run/inn.pid' endscript nocompress }
希望有所帮助