Comment puis-je effectuer une rotation mensuelle des fichiers journaux à l'aide de Perl?
Question
Sous Unix, je dois pouvoir archiver les fichiers journaux dans des dossiers mensuels, étiquetés en conséquence. Comment faire cela en Perl?
La solution
Donnons une idée réelle de Perl, puisque c’est ce qui a été demandé:
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
La sortie est
### $directory: '/my/base/directory/2009-January'
### $log_file_path: '/my/base/directory/2009-January/system.log'
Notes
- Installez
Smart :: Comments
ou commentez-le. - La constante
$ BASE_LOG_DIRECTORY
est écrite en style Readonly / PBP - Tout le reste devrait juste venir avec Perl.
Autres conseils
Faut-il que ce soit en Perl? Avez-vous essayé logrotate?
En ce qui concerne une solution Perl: mkdir créera les répertoires. Si vous utilisez POSIX 'strftime'; , vous pourrez alors générer un répertoire agréable. des noms basés sur l’heure actuelle ( mon $ dirname = strftime ('% Y-% m-% d', heure locale ()) générera une chaîne AAAA-MM-JJ), et vous pouvez déplacer les fichiers à l'aide de renommer . C’est juste le noyau Perl, il y a une tonne de modules CPAN qui font tout ou partie de cela (comme File :: Copy, au lieu de renommer).
Lorsque j'ai eu cette tâche, j'utilise cronolog .
Le package inclut un script Perl appelé cronosplit
, que vous pouvez utiliser pour fractionner un fichier journal monolithique existant en sous-répertoires % Y /% m /% d
.
Cronolog lui-même est un binaire écrit en C qui peut être utilisé comme cible canalisée pour la journalisation. Par exemple, vous pouvez l’utiliser dans Apache httpd.conf:
CustomLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"