在Unix中,我需要能够将日志文件存档到每月文件夹中,并相应地标记。我如何在Perl中执行此操作?
答案 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'
注释
Smart::Comments
,或将其注释掉。 $BASE_LOG_DIRECTORY
以Readonly / PBP样式编写