如何使用Perl每月轮换日志文件?

时间:2009-01-14 18:52:06

标签: perl unix logging rotation

在Unix中,我需要能够将日志文件存档到每月文件夹中,并相应地标记。我如何在Perl中执行此操作?

3 个答案:

答案 0 :(得分:5)

它必须是Perl吗?你试过logrotate吗?

就Perl解决方案而言: mkdir 将创建目录,如果您使用POSIX'strftime'; ,那么您将能够生成漂亮的目录基于当前时间的名称(即我的$ dirname = strftime('%Y-%m-%d',localtime())将生成YYYY-MM-DD字符串),然后你可以使用重命名移动文件。这只是核心Perl,有大量CPAN模块可以完成部分或全部操作(例如File :: Copy,而不是重命名)。

答案 1 :(得分:2)

当我完成此任务时,我使用cronolog

该软件包包含一个名为cronosplit的Perl脚本,您可以使用该脚本将现有的单片日志文件拆分为%Y/%m/%d个子目录。

Cronolog本身是一个用C语言编写的二进制文件,可以用作日志记录的管道目标。例如,您可以在Apache httpd.conf中使用它:

CustomLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"

答案 2 :(得分:2)

让我们提供一个真实的Perl想法,因为这就是要求:

use File::Path qw<mkpath>;
use File::Spec;
use POSIX qw<strftime>;
use Smart::Comments;

my $directory 
    = File::Spec->catfile( $BASE_LOG_DIRECTORY
                         , strftime( "%Y-%B", localtime ) #2009-January
    );
### $directory
unless ( -e $directory ) {
    mkpath( $directory, { verbose => 1 } );
}
my $log_file_path = File::Spec->catfile( $directory, 'system.log' );
### $log_file_path

输出

### $directory: '/my/base/directory/2009-January'
### $log_file_path: '/my/base/directory/2009-January/system.log'

注释

  1. 安装Smart::Comments,或将其注释掉。
  2. 常量$BASE_LOG_DIRECTORY以Readonly / PBP样式编写
  3. Perl应该只提供其他所有内容。