天天看點

perl按日期歸檔日志

幫一上海朋友工廠維護一台freebsd伺服器,該伺服器上運作着squid等服務。伺服器上有一支perl程式會每天定時的切割當天的squid日志,以日期形式儲存在某目錄下,大體如下:

-rw-r--r--  1 root  wheel   51827130 Aug 20 04:27 20110801.log 

-rw-r--r--  1 root  wheel   56598624 Aug 20 04:27 20110802.log 

-rw-r--r--  1 root  wheel   66925544 Aug 20 04:27 20110803.log 

-rw-r--r--  1 root  wheel   47917440 Aug 20 04:27 20110804.log 

-rw-r--r--  1 root  wheel   44134286 Aug 20 04:27 20110805.log 

-rw-r--r--  1 root  wheel   43705704 Aug 20 04:27 20110808.log 

-rw-r--r--  1 root  wheel   33358662 Aug 20 04:27 20110809.log 

-rw-r--r--  1 root  wheel   35820354 Aug 20 04:27 20110810.log 

-rw-r--r--  1 root  wheel   48065784 Aug 20 04:27 20110811.log 

-rw-r--r--  1 root  wheel   38021175 Aug 20 04:27 20110812.log 

-rw-r--r--  1 root  wheel   30382856 Aug 20 04:27 20110813.log 

-rw-r--r--  1 root  wheel   11898255 Aug 20 04:27 20110815.log 

-rw-r--r--  1 root  wheel   10068232 Aug 20 04:27 20110816.log 

-rw-r--r--  1 root  wheel   12431556 Aug 20 04:27 20110817.log 

-rw-r--r--  1 root  wheel    6405197 Aug 20 04:27 20110818.log 

-rw-r--r--  1 root  wheel    5054207 Aug 20 04:27 20110819.log 

-rw-r--r--  1 root  wheel    3455222 Aug 26 04:14 20110821.log 

-rw-r--r--  1 root  wheel  124680376 Aug 26 04:14 20110822.log 

-rw-r--r--  1 root  wheel  150105140 Aug 26 04:14 20110823.log 

-rw-r--r--  1 root  wheel    5183330 Aug 26 04:14 20110824.log 

-rw-r--r--  1 root  wheel    6486877 Aug 26 04:14 20110825.log 

-rw-r--r--  1 root  wheel    8481735 Sep  2 04:03 20110828.log 

-rw-r--r--  1 root  wheel   22789068 Sep  2 04:03 20110829.log 

-rw-r--r--  1 root  wheel   68841800 Sep  2 04:03 20110830.log 

要求:編寫一腳本程式,對該目錄中日志以年月的形式進行歸檔,如201108.tar.gz

代碼如下:

#!/usr/bin/perl -w 

use strict; 

use Shell qw/mv/; 

use File::Path qw/remove_tree/; //調用該子產品的目的是為了删除歸檔前的非空目錄

my %log; 

if ( $< != 0 ) { 

   printf "%s","You must run this script as root\n"; 

opendir LOG,'/data/squid_log' or die "$!\n"; 

while ( my $file = readdir LOG ) { 

        chomp $file; 

        next unless $file =~ /^(\d{6})\d+/; 

        push @{$log{$1}},$file; 

closedir LOG; 

for my $str ( sort keys %log ) { 

    my @array = @{$log{$str}}; 

    mkdir $str,0755; 

    my $sh = Shell->new(); 

    $sh->mv("@array $str"); 

    system("tar czvf ${str}.tar.gz $str"); 

    remove_tree("$str",{ verbose => 1,}); 

歸檔過程:

a 201102 

a 201102/20110213.log 

a 201102/20110214.log 

a 201102/20110218.log 

a 201102/20110220.log 

a 201102/20110221.log 

a 201102/20110222.log 

a 201102/20110223.log 

a 201102/20110224.log 

a 201102/20110225.log 

a 201102/20110228.log 

unlink 201102/20110213.log 

unlink 201102/20110214.log 

unlink 201102/20110218.log 

unlink 201102/20110220.log 

unlink 201102/20110221.log 

unlink 201102/20110222.log 

unlink 201102/20110223.log 

unlink 201102/20110224.log 

unlink 201102/20110225.log 

unlink 201102/20110228.log 

rmdir 201102 

……………………………………………………………………

最後歸檔後的效果:

[/data/squid_log]# ll 

total 203762 

-rw-r--r--  1 root  wheel  12817056 Sep 16 20:49 201012.tar.gz 

-rw-r--r--  1 root  wheel   8170954 Sep 16 20:49 201101.tar.gz 

-rw-r--r--  1 root  wheel   8819026 Sep 16 20:49 201102.tar.gz 

-rw-r--r--  1 root  wheel  15008666 Sep 16 20:49 201104.tar.gz 

-rw-r--r--  1 root  wheel  10950252 Sep 16 20:49 201105.tar.gz 

-rw-r--r--  1 root  wheel  70723508 Sep 16 20:50 201106.tar.gz 

-rw-r--r--  1 root  wheel  13035446 Sep 16 20:50 201107.tar.gz 

-rw-r--r--  1 root  wheel  63533990 Sep 16 20:51 201108.tar.gz 

-rw-r--r--  1 root  wheel   5290849 Sep 16 20:51 201109.tar.gz 

-rwx------  1 root  wheel       646 Sep 16 17:30 log.pl

本文轉自dongfang_09859 51CTO部落格,原文連結:http://blog.51cto.com/hellosa/666737,如需轉載請自行聯系原作者