Come posso ruotare i file di registro mensilmente usando Perl?
Domanda
In Unix, devo essere in grado di archiviare i file di registro in cartelle mensili, etichettati di conseguenza. Come posso farlo in Perl?
Soluzione
Forniamo una vera idea Perl, poiché è quello che è stato chiesto:
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
L'output è
### $directory: '/my/base/directory/2009-January'
### $log_file_path: '/my/base/directory/2009-January/system.log'
Note
- Installa
Smart :: Commenti
o commentalo. - La costante
$ BASE_LOG_DIRECTORY
è scritta in stile Readonly / PBP - Tutto il resto dovrebbe venire con Perl.
Altri suggerimenti
Deve essere Perl? Hai provato a logrotate?
Per quanto riguarda una soluzione Perl: mkdir creerà le directory e se usi POSIX 'strftime'; , allora sarai in grado di generare una bella directory i nomi in base all'ora corrente (ovvero my $ dirname = strftime ('% Y-% m-% d', localtime ()) genereranno una stringa AAAA-MM-GG) e tu puoi spostare i file usando rinomina . Questo è solo il core Perl, ci sono un sacco di moduli CPAN che fanno tutto o tutto questo (come File :: Copia, invece di rinominare).
Quando ho avuto questo compito, utilizzo cronolog .
Il pacchetto include uno script Perl chiamato cronosplit
che è possibile utilizzare per dividere un file di registro monolitico esistente nelle sottodirectory % Y /% m /% d
.
Cronolog stesso è un file binario scritto in C che può essere utilizzato come destinazione convogliata per la registrazione. Ad esempio, puoi usarlo in un httpd.conf di Apache:
CustomLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"