2

Unix では、ログ ファイルを月ごとのフォルダにアーカイブし、それに応じてラベルを付ける必要があります。Perlでこれを行うにはどうすればよいですか?

4

3 に答える 3

5

それはPerlである必要がありますか?logrotateを試しましたか?

Perl ソリューションに関する限り: mkdirはディレクトリを作成します。POSIX 'strftime' を使用する場合は、、その後、現在の時刻に基づいて適切なディレクトリ名を生成できます (つまり、my $dirname = strftime('%Y-%m-%d',localtime())は YYYY-MM-DD 文字列を生成します) )、 renameを使用してファイルを移動できます。これは単なるコア Perl です。これの一部またはすべてを行う CPAN モジュールがたくさんあります (名前の変更の代わりに File::Copy など)。

于 2009-01-14T19:06:19.023 に答える
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 に答える
2

このタスクが完了したら、 cronologを使用します。

パッケージにはcronosplit、既存のモノリシック ログ ファイルをサブディレクトリに分割するために使用できるPerl スクリプトが含まれています%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 に答える