Domanda

In Unix, devo essere in grado di archiviare i file di registro in cartelle mensili, etichettati di conseguenza. Come posso farlo in Perl?

È stato utile?

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

  1. Installa Smart :: Commenti o commentalo.
  2. La costante $ BASE_LOG_DIRECTORY è scritta in stile Readonly / PBP
  3. 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"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top