wxsheng 发表于 2018-8-31 13:04:44

perl按日期归档日志

  帮一上海朋友工厂维护一台freebsd服务器,该服务器上运行着squid等服务。服务器上有一支perl程序会每天定时的切割当天的squid日志,以日期形式保存在某目录下,大体如下:
  


[*]-rw-r--r--1 rootwheel   51827130 Aug 20 04:27 20110801.log
[*]-rw-r--r--1 rootwheel   56598624 Aug 20 04:27 20110802.log
[*]-rw-r--r--1 rootwheel   66925544 Aug 20 04:27 20110803.log
[*]-rw-r--r--1 rootwheel   47917440 Aug 20 04:27 20110804.log
[*]-rw-r--r--1 rootwheel   44134286 Aug 20 04:27 20110805.log
[*]-rw-r--r--1 rootwheel   43705704 Aug 20 04:27 20110808.log
[*]-rw-r--r--1 rootwheel   33358662 Aug 20 04:27 20110809.log
[*]-rw-r--r--1 rootwheel   35820354 Aug 20 04:27 20110810.log
[*]-rw-r--r--1 rootwheel   48065784 Aug 20 04:27 20110811.log
[*]-rw-r--r--1 rootwheel   38021175 Aug 20 04:27 20110812.log
[*]-rw-r--r--1 rootwheel   30382856 Aug 20 04:27 20110813.log
[*]-rw-r--r--1 rootwheel   11898255 Aug 20 04:27 20110815.log
[*]-rw-r--r--1 rootwheel   10068232 Aug 20 04:27 20110816.log
[*]-rw-r--r--1 rootwheel   12431556 Aug 20 04:27 20110817.log
[*]-rw-r--r--1 rootwheel    6405197 Aug 20 04:27 20110818.log
[*]-rw-r--r--1 rootwheel    5054207 Aug 20 04:27 20110819.log
[*]-rw-r--r--1 rootwheel    3455222 Aug 26 04:14 20110821.log
[*]-rw-r--r--1 rootwheel124680376 Aug 26 04:14 20110822.log
[*]-rw-r--r--1 rootwheel150105140 Aug 26 04:14 20110823.log
[*]-rw-r--r--1 rootwheel    5183330 Aug 26 04:14 20110824.log
[*]-rw-r--r--1 rootwheel    6486877 Aug 26 04:14 20110825.log
[*]-rw-r--r--1 rootwheel    8481735 Sep2 04:03 20110828.log
[*]-rw-r--r--1 rootwheel   22789068 Sep2 04:03 20110829.log
[*]-rw-r--r--1 rootwheel   68841800 Sep2 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 &quot;%s&quot;,&quot;You must run this script as root\n&quot;;
[*]}
[*]
[*]opendir LOG,'/data/squid_log' or die &quot;$!\n&quot;;
[*]
[*]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(&quot;@array $str&quot;);
[*]    system(&quot;tar czvf ${str}.tar.gz $str&quot;);
[*]    remove_tree(&quot;$str&quot;,{ 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
[*]……………………………………………………………………
  

  最后归档后的效果:
  


[*]# ll
[*]total 203762
[*]-rw-r--r--1 rootwheel12817056 Sep 16 20:49 201012.tar.gz
[*]-rw-r--r--1 rootwheel   8170954 Sep 16 20:49 201101.tar.gz
[*]-rw-r--r--1 rootwheel   8819026 Sep 16 20:49 201102.tar.gz
[*]-rw-r--r--1 rootwheel15008666 Sep 16 20:49 201104.tar.gz
[*]-rw-r--r--1 rootwheel10950252 Sep 16 20:49 201105.tar.gz
[*]-rw-r--r--1 rootwheel70723508 Sep 16 20:50 201106.tar.gz
[*]-rw-r--r--1 rootwheel13035446 Sep 16 20:50 201107.tar.gz
[*]-rw-r--r--1 rootwheel63533990 Sep 16 20:51 201108.tar.gz
[*]-rw-r--r--1 rootwheel   5290849 Sep 16 20:51 201109.tar.gz
[*]-rwx------1 rootwheel       646 Sep 16 17:30 log.pl


页: [1]
查看完整版本: perl按日期归档日志