在 Unix 中,我需要能够将日志文件归档到每月文件夹中,并进行相应标记。我如何在 Perl 中做到这一点?
Alex Wong
问问题
2516 次
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'
笔记
- 安装
Smart::Comments
,或将其注释掉。 - 该常量
$BASE_LOG_DIRECTORY
以 Readonly/PBP 样式编写 - 其他一切都应该随 Perl 一起提供。
于 2009-01-14T23:14:18.057 回答