2

在 Unix 中,我需要能够将日志文件归档到每月文件夹中,并进行相应标记。我如何在 Perl 中做到这一点?

4

3 回答 3

5

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

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

于 2009-01-14T19:06:19.023 回答
2

当我完成这项任务时,我使用cronolog

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

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

CustomLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"
于 2009-01-14T19:04:40.587 回答
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 一起提供。
于 2009-01-14T23:14:18.057 回答